65,187
社区成员




class X实例(1 byte,用于在内存定位的char)
class Y实例(4 byte,char + alignment)
class Z实例(4 byte,char + alignment)
class A实例(0 byte)
alignment (3 byte)
以上合共12 byte。其中Y实例和Z实例的“因virtual base class X而配置”的大小被剔除,估计就是剔除了2个X指针。
A a;
Y& y = a;
struct non_copyable_t
{
non_copyable_t () = default;
non_copyable_t (non_copyable_t const&) = delete; // no copy construction.
};
non_copyable_t even_nrv_will_fail ()
{
return non_copyable_t{};
}
这个例子里,从优化技术上讲,nrv 几乎 100% 能够把复制构造省掉。但如果据此就不检查复制构造函数语意的话,则破坏了类作者的意图,因为 delete copy ctor 的目的就是禁止复制,为了保证正确语意,标准要求 nrv 也必须尊重 copy ctor.
另外一个原因是,如果标准允许 nrv 忽略 copy ctor 语意,那么程序行为就会很怪异。体现在,当编译器能够实施 nrv 的时候,一切看似正常;而当编译器不能执行的时候,则会出编译错误,因为此时需要调用 copy ctor,后者却不能调用。要是这样的话,估计又会有不少人要骂 c++ 了。
//以下声明展现了bitwise copy semantics
class Word {
public:
Word(const char*);
~Word() {delete [] str;}
// ...
private:
int cnt;
char* str;
}
[/quote]
对。there is no magic。你想想啊,你不写 copy ctor,编译器再不生成一个,谁都不管,那复制是怎么进行的?
具体条件其实很繁琐,总之精神就是,在类定义符合标准认定的某些条件下,编译器自动生成 copy ctor,其行为即对所有 data member 和 base class 执行 memberwise copy construction。你说的那个 bitwise copy,只对 trivially copy constructible 类型管用,其他的不行。
建议楼主先把 c++ 基础打牢,再来读"深"这样的著作,人家深子不是白叫的。强行攻之的话,即便能够走下来,所获可能也不如打牢基础后再读来的多和深。
//以下声明展现了bitwise copy semantics
class Word {
public:
Word(const char*);
~Word() {delete [] str;}
// ...
private:
int cnt;
char* str;
}
struct non_copyable_t
{
non_copyable_t () = default;
non_copyable_t (non_copyable_t const&) = delete; // no copy construction.
};
non_copyable_t even_nrv_will_fail ()
{
return non_copyable_t{};
}
这个例子里,从优化技术上讲,nrv 几乎 100% 能够把复制构造省掉。但如果据此就不检查复制构造函数语意的话,则破坏了类作者的意图,因为 delete copy ctor 的目的就是禁止复制,为了保证正确语意,标准要求 nrv 也必须尊重 copy ctor.
另外一个原因是,如果标准允许 nrv 忽略 copy ctor 语意,那么程序行为就会很怪异。体现在,当编译器能够实施 nrv 的时候,一切看似正常;而当编译器不能执行的时候,则会出编译错误,因为此时需要调用 copy ctor,后者却不能调用。要是这样的话,估计又会有不少人要骂 c++ 了。[/quote]
侯先生的原话在这里http://jjhou.boolan.com/qa-object-model.htm,靠下面的黑色字
关于copy ctor,《深》书还提及,如果某class没有copy ctor(甚至可以连ctor也没有,如P52最上面),只要它符合“bitwise copy semantics”,那么编译器无需为其合成default copy ctor(从P50来看Annotated Reference Manual也持相同观点)。——这么一来,存在一种情形:“bitwise copy semantics”的class编译前后均不存在copy ctor,也就没有“不破坏原copy ctor操代码的意图”的要求,言则copy ctor对NRV的启发行为可能还在其它方面的。
[/quote]
别猜了,你混淆了标准语意和实现细节。
从语意上说,一个支持复制行为的类是不可能没有复制构造函数的,因为复制构造函数是执行复制的。
从实现上说,bitwise copy 是编译器为你默认提供的,你可以写你自己的,也可以用默认的。但无论何种情况,都是存在复制构造函数的。不能说因为是 bitwise copy,所以就不算有复制构造函数了,然后推论 '也就没有“不破坏原copy ctor操代码的意图”的要求'。
Lippman 明显理解这一点,所以他认为必须要有复制构造函数才能够支持 nrv 优化。因为唯一一种没有复制构造函数的情况就是我在 #5 给出的例子,而恰恰是在这种情况下,nrv 就完蛋了。[/quote]
更正一下吧,#5 的例子不是唯一一类没有复制构造函数的情况,还有其他情况。但 nrv 一定要求复制构造函数存在。
struct non_copyable_t
{
non_copyable_t () = default;
non_copyable_t (non_copyable_t const&) = delete; // no copy construction.
};
non_copyable_t even_nrv_will_fail ()
{
return non_copyable_t{};
}
这个例子里,从优化技术上讲,nrv 几乎 100% 能够把复制构造省掉。但如果据此就不检查复制构造函数语意的话,则破坏了类作者的意图,因为 delete copy ctor 的目的就是禁止复制,为了保证正确语意,标准要求 nrv 也必须尊重 copy ctor.
另外一个原因是,如果标准允许 nrv 忽略 copy ctor 语意,那么程序行为就会很怪异。体现在,当编译器能够实施 nrv 的时候,一切看似正常;而当编译器不能执行的时候,则会出编译错误,因为此时需要调用 copy ctor,后者却不能调用。要是这样的话,估计又会有不少人要骂 c++ 了。[/quote]
侯先生的原话在这里http://jjhou.boolan.com/qa-object-model.htm,靠下面的黑色字
关于copy ctor,《深》书还提及,如果某class没有copy ctor(甚至可以连ctor也没有,如P52最上面),只要它符合“bitwise copy semantics”,那么编译器无需为其合成default copy ctor(从P50来看Annotated Reference Manual也持相同观点)。——这么一来,存在一种情形:“bitwise copy semantics”的class编译前后均不存在copy ctor,也就没有“不破坏原copy ctor操代码的意图”的要求,言则copy ctor对NRV的启发行为可能还在其它方面的。
[/quote]
别猜了,你混淆了标准语意和实现细节。
从语意上说,一个支持复制行为的类是不可能没有复制构造函数的,因为复制构造函数是执行复制的。
从实现上说,bitwise copy 是编译器为你默认提供的,你可以写你自己的,也可以用默认的。但无论何种情况,都是存在复制构造函数的。不能说因为是 bitwise copy,所以就不算有复制构造函数了,然后推论 '也就没有“不破坏原copy ctor操代码的意图”的要求'。
Lippman 明显理解这一点,所以他认为必须要有复制构造函数才能够支持 nrv 优化。因为唯一一种没有复制构造函数的情况就是我在 #5 给出的例子,而恰恰是在这种情况下,nrv 就完蛋了。
struct non_copyable_t
{
non_copyable_t () = default;
non_copyable_t (non_copyable_t const&) = delete; // no copy construction.
};
non_copyable_t even_nrv_will_fail ()
{
return non_copyable_t{};
}
这个例子里,从优化技术上讲,nrv 几乎 100% 能够把复制构造省掉。但如果据此就不检查复制构造函数语意的话,则破坏了类作者的意图,因为 delete copy ctor 的目的就是禁止复制,为了保证正确语意,标准要求 nrv 也必须尊重 copy ctor.
另外一个原因是,如果标准允许 nrv 忽略 copy ctor 语意,那么程序行为就会很怪异。体现在,当编译器能够实施 nrv 的时候,一切看似正常;而当编译器不能执行的时候,则会出编译错误,因为此时需要调用 copy ctor,后者却不能调用。要是这样的话,估计又会有不少人要骂 c++ 了。[/quote]
侯先生的原话在这里http://jjhou.boolan.com/qa-object-model.htm,靠下面的黑色字
关于copy ctor,《深》书还提及,如果某class没有copy ctor(甚至可以连ctor也没有,如P52最上面),只要它符合“bitwise copy semantics”,那么编译器无需为其合成default copy ctor(从P50来看Annotated Reference Manual也持相同观点)。——这么一来,存在一种情形:“bitwise copy semantics”的class编译前后均不存在copy ctor,也就没有“不破坏原copy ctor操代码的意图”的要求,言则copy ctor对NRV的启发行为可能还在其它方面的。