A*pA=新A之间的差值;A*pA=新的A(); 在C++中,以下动态对象创建的准确差异是: A* pA = new A; A* pA = new A();

A*pA=新A之间的差值;A*pA=新的A(); 在C++中,以下动态对象创建的准确差异是: A* pA = new A; A* pA = new A();,c++,C++,我做了一些测试,但似乎在这两种情况下,都会调用默认构造函数,并且只调用它。我在寻找关于性能的任何差异 感谢您,它完全一样,而且性能方面也一样:)lexer在第一个版本中需要少扫描两个字符,因此编译过程要快一点;) 如果A是POD类型,则new A将分配一个新的A对象,但保留一个不确定的值,否则new A将默认初始化新对象 在所有情况下,new A()值将初始化新的A对象 对于POD类型,这显然是不同的行为,但也会影响没有使用声明构造函数的非POD、非联合类类型 例如 A是一种没有用户声明构造函数

我做了一些测试,但似乎在这两种情况下,都会调用默认构造函数,并且只调用它。我在寻找关于性能的任何差异


感谢您,它完全一样,而且性能方面也一样:)

lexer在第一个版本中需要少扫描两个字符,因此编译过程要快一点;)

如果
A
是POD类型,则
new A
将分配一个新的
A
对象,但保留一个不确定的值,否则
new A
将默认初始化新对象

在所有情况下,
new A()
值将初始化新的
A
对象

对于POD类型,这显然是不同的行为,但也会影响没有使用声明构造函数的非POD、非联合类类型

例如

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:如何初始化构造函数的成员初始值设定项列表中未列出的基和成员


请参阅STL实现代码(例如分配器),然后您就会明白。

这根本不是真的。这两个表达式对于没有用户定义构造函数的POD类型和非POD类类型都有不同的效果。而且,这两个表达式的措辞实际上很混乱。POD到底是什么?“简单的旧数据”。它是C++中一个非常重要的概念,缩写在标准中广泛使用。我很抱歉混淆的措辞。注意到在修订的C++标准中引入了“价值初始化”的概念。这也将
newa
newa()
之间的区别移到了“是否有用户声明的构造函数”行。在原来的C++标准(C++ 98)中没有“值初始化”,两者之间的差异是由POD/NOPD属性定义的。根据编译器遵循的语言规范,可能会得到不同的结果。顺便说一句,上面的结构A就是一个例子。
struct A
{
    int a;
    std::string s;
};