重叠对象的复制省略

问题描述 投票:0回答:1

参考:复制省略

这仅适用于已知正在初始化的对象不是潜在重叠子对象的情况:

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++ object polymorphism c++14 copy-elision
1个回答
0
投票

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

因为物体的大小会是错误的。如果是

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

sizeof(D)
可以大于
sizeof(C)
,如果是,则无法删除基类,因为删除的基础对象中没有派生部分的空间。

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

从另一个方向你也会得到同样的结果。如果

D
是另一个对象的基类,那么省略
D(g())
将意味着实际创建的对象是
D
,而不是继承它的任何东西,如果它比你大就有麻烦了。

© www.soinside.com 2019 - 2024. All rights reserved.