C++中值初始化是否先零初始化带默认成员初始化器的对象成员?
值初始化下的成员初始化行为解析
规则回顾
根据cppreference对值初始化的定义:
若T是(可能带cv限定的)类类型:如果T的默认初始化选择的构造函数在C11前非用户声明、C11起非用户提供,则对象先被零初始化;无论何种情况,对象都会被默认初始化。
问题代码
struct Foo { int x = 10; int y; }; Foo myfunc() { return Foo(); // 值初始化,x会先被零初始化为0吗? } int main() { myfunc(); return 0; }
问题解答
x是否会先零初始化再被设为10?
是。C++11及以后,Foo的默认构造函数由编译器自动生成(属于非用户提供的构造函数),因此触发值初始化时会分两步执行:首先是零初始化,Foo的所有成员都会被置为0(包括x和y);随后执行默认初始化,编译器生成的构造函数会调用x的默认成员初始化器,将其设为10。第二次写入是初始化还是赋值?
从C++标准语义来讲,这是初始化而非赋值。虽然内存操作上可能表现为两次写入,但默认成员初始化器是在对象构造过程中执行的,属于成员初始化流程的一部分,并非对象完全初始化完成后的赋值操作。这里的“初始化仅能发生一次”是针对成员的生命周期而言,而值初始化的两步流程(零初始化+默认初始化)都属于对象构造阶段的整体初始化动作,是标准允许的复合初始化步骤。
另外需要注意:编译器有权进行优化,比如直接将x初始化为10而跳过零初始化的写入操作,只要这种优化不会改变程序的可见行为。
内容的提问来源于stack exchange,提问作者Rebased
相关产品推荐
相关产品推荐

