复制省略重叠对象

Copy elision of overlapping objects

提问人:Vinod 提问时间:9/19/2023 最后编辑:NathanOliverVinod 更新时间:9/19/2023 访问量:52

问:

参考:复制省略

仅当已知正在初始化的对象不是潜在重叠的子对象时,这才适用:

struct C { /* ... */ };
C f();
 
struct D;
D g();
 
struct D : C
{
    D() : C(f()) {}    // no elision when initializing a base-class subobject
    D(int) : D(g()) {} // no elision because the D object being initialized might
                       // be a base-class subobject of some other class
};

如果编译器可以确定非重叠对象(例如主数据类型)的内存布局以省略复制,而是在其目标位置构造对象,为什么它不能对重叠对象也做同样的事情呢?系统级别的限制是什么,使编译器无法执行此类复制省略?

C++ 对象 多态性 C++14 复制省略

评论


答:

0赞 NathanOliver 9/19/2023 #1

为什么它不能对重叠的对象也做同样的事情?

因为对象的大小会是错误的。在以下情况下

D() : C(f()) {} 

可以大于 如果大于,则不能省略基类,因为这样省略的基对象中没有派生部分的空间。sizeof(D)sizeof(C)

D(int) : D(g()) {}

你在另一个方向得到同样的东西。如果是另一个对象的基类,那么省略将意味着实际创建的对象是一个而不是继承它的对象,如果它比你大,你就会遇到麻烦。DD(g())D

评论

0赞 Vinod 9/19/2023
我不确定我是否完全理解你的解释。我想,在内存中,关于多态类对象的基段和派生段,会有明确的界限。既然如此,编译器通过复制省略在内存中构造基段不是很简单吗,就像在主数据类型对象(如 int)的情况下一样?