在C++中,就是既下列動態對象的作品之間的確切區別:A * pA = new A之間的區別;和A * pA = new A();
A* pA = new A;
A* pA = new A();
我做了一些測試,但似乎在這兩種情況下,默認的構造函數被調用,只有它。我正在尋找關於性能有什麼區別...
感謝
在C++中,就是既下列動態對象的作品之間的確切區別:A * pA = new A之間的區別;和A * pA = new A();
A* pA = new A;
A* pA = new A();
我做了一些測試,但似乎在這兩種情況下,默認的構造函數被調用,只有它。我正在尋找關於性能有什麼區別...
感謝
如果A
是POD型,然後將new A
分配一個新的A
對象,但有一個不確定的值離開它,否則會new A
默認初始化新的對象。
在所有情況下new A()
將值初始化新的A
對象。
對於POD類型,這顯然是不同的行爲,但也會影響非POD,非聯合類類型,而不使用已聲明的構造函數。
E.g.
struct A
{
int a;
std::string s;
};
A
是一個非POD類類型,沒有用戶聲明的構造函數。當A
爲默認初始化爲時,會調用隱式定義的構造函數,調用s
(非POD類型)的默認構造函數,但a
未初始化。
當A
是值初始化,因爲它沒有使用-聲明的構造,它的所有成員都是值初始化這意味着對於s
默認構造被調用並a
是零初始化。
ISO 14882:2003的引用:
5.3.4 [expr.new]/15:如何通過一個new
表達式分配的對象被初始化取決於是否省略了初始化,一對括號或除此以外。
8.5 [dcl.init]/5:含義零初始化,缺省初始化和值初始化。
12.1 [class.ctor]/7,8:用戶編寫的構造函數的形式,它與隱式定義的默認構造函數的行爲相匹配。
12.6.2 [class.base.init]/4:未初始化構造函數的成員初始值設定項列表中未列出的基和成員的初始值。
這是完全一樣的,也是明智的性能:)
這根本不對。這兩個表達式對於沒有用戶定義的構造函數的POD類型和非POD類類型都有不同的影響。 – 2009-10-17 09:57:52
Charles Bailey是正確的。 – 2009-10-17 10:19:39
什麼是「POD」? – hasen 2009-10-17 10:42:14
的詞法分析器將在第一個版本掃描兩個字符少,所以編譯過程是快一點;)
...並且它們具有不同的語義。 – 2009-10-17 09:58:24
請參閱STL實現代碼(例如allocator),那麼你就會明白。
這是正確的。 – 2009-10-17 10:17:10
嗯,有沒有參考? – hasen 2009-10-17 10:43:47
,並且措辭實際上令人困惑。 POD到底是什麼? – hasen 2009-10-17 10:47:46