在C ++中,两个动态对象创建之间的确切区别是什么:
A* pA = new A;
A* pA = new A();
我做了一些测试,但似乎在这两种情况下都会调用默认构造函数并且只调用它。我正在寻找有关性能的任何不同......
由于
答案 0 :(得分:38)
如果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:如何初始化未在构造函数的成员初始值设定项列表中列出的基数和成员。
答案 1 :(得分:0)
它完全相同,也是表现明智的:)
答案 2 :(得分:0)
词法分析器必须在第一个版本中扫描少两个字符,因此编译过程会快一些;)
答案 3 :(得分:-1)
请参阅STL实施代码(例如分配器)然后您将理解。