在C++中,以下两种动态对象创建方式有什么确切的区别:
A* pA = new A;
A* pA = new A();
我进行了一些测试,但在两种情况下都只发现调用了默认构造函数。我正在寻找关于性能的任何差异...
谢谢
在C++中,以下两种动态对象创建方式有什么确切的区别:
A* pA = new A;
A* pA = new A();
我进行了一些测试,但在两种情况下都只发现调用了默认构造函数。我正在寻找关于性能的任何差异...
谢谢
A
是POD类型,那么new A
将会分配一个新的A
对象但会保留一个不确定的值。否则,new A
将会使用默认值初始化这个新对象。new A()
将会对新的A
对象进行值初始化。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:如何初始化不在构造函数的成员初始化器列表中列出的基类和成员。
在第一个版本中,词法分析器将少扫描两个字符,因此编译过程会稍微快一些;)
完全一样,性能也一样好 :)
new A
和new A()
之间的区别移动到“是否有用户声明的构造函数”这一行。在原始的 C++ 标准(C++98)中,不存在“值初始化”,两者之间的区别是由 POD/非-POD 属性定义的。根据您的编译器遵循的语言规范,可能会得到不同的结果。顺便说一下,上面的struct A
是一个例子。 - AnT stands with Russia