如果我使用placement new初始化POD类,我可以假设内存将默认初始化(为零)吗? This resource明确指出如果你明确地调用零参数默认构造函数,那么这些字段将被默认初始化,但是不清楚这是否会使用placement new的默认实现(传递地址)。在这种情况下,存储器的标准行为是否归零?
答案 0 :(得分:4)
从一开始:
5.3.4 / 15:
- 如果 new-initializer 的格式为
()
,则该项目已初始化值(8.5);
8.5 / 5:
要值初始化 T类型的对象意味着:
如果T是具有用户声明的构造函数(12.1)的类类型(第9节),则调用T的默认构造函数(如果T没有可访问的默认构造函数,则初始化是错误的)
如果T是没有用户声明的构造函数的非联合类类型,那么T的每个非静态数据成员和基类组件都是值初始化的;
如果T是数组类型,则每个元素都是值初始化的;
否则,该对象为零初始化
第一个项目符号不适用于此处,因为您有一个POD类型,因此您不能拥有用户声明的构造函数。您的类型的成员只能是POD类型,例如int
,float
等,或者是嵌套结构,也是POD或POD类型的数组。所以最终他们每个人都会在最后的子弹中结束:“否则,对象是零初始化的。”
发生此初始化是因为POD类在您提供的内存中初始化。内存是由操作系统分配的,或者是否提供了地址无关紧要。
所以,恕我直言,答案是肯定的 - 会员将初始化为零。