gpt4 book ai didi

c++ - 为什么在初始化列表中分配数据时没有创建额外的拷贝?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:57 25 4
gpt4 key购买 nike

Parashift很好地解释了初始化列表,但没有解释为什么在 ctor 主体中赋值之前会创建一个额外的变量拷贝,但在通过初始化列表赋值时不会创建额外的拷贝。
我什至遇到过使用++i 而不是 i++ 的建议,因为前者避免了在赋值之前创建临时 i 。在 ctor 体内分配的 POD 是否相同?在分配发生之前创建临时变量?

换句话说,为什么编译器需要创建一个额外的变量拷贝?为什么不能直接给变量赋值呢?
为什么?

最佳答案

考虑以下几点:

struct C { 
C() { /* construct the object */ }
};

struct X {
C member;

X() { member = C(); }
};

X() 构造函数与您所说的一样:

X() : member() { member = C(); }

首先调用C构造器构造member数据成员。然后执行 X 的主体,创建第二个临时 C 对象并将其分配给 member,然后销毁临时对象。


请注意,这仅适用于自动初始化的类型。如果 memberint 类型或 POD 类类型(例如),当 X 构造函数的主体是进入。

对于这样的类型,从性能的角度来看,无论是在初始化列表中初始化数据成员还是在构造函数主体中分配给数据成员都没有关系;区别完全是风格上的。在可能的情况下,为了一致性,仍应优先使用初始化列表。

关于c++ - 为什么在初始化列表中分配数据时没有创建额外的拷贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6674447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com