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:如何初始化构造函数的成员初始值设定项列表中未列出的基和成员
newa
和newa()
之间的区别移到了“是否有用户声明的构造函数”行。在原来的C++标准(C++ 98)中没有“值初始化”,两者之间的差异是由POD/NOPD属性定义的。根据编译器遵循的语言规范,可能会得到不同的结果。顺便说一句,上面的结构A就是一个例子。
struct A
{
int a;
std::string s;
};