我在x86下使用Visual Studio 2019 Community版本。使用按位复制语义的编译器生成的 Copy 构造函数倾向于复制填充。而不使用按位复制语义的编译器生成的复制构造函数往往会忽略填充。而编译器生成的复制赋值运算符始终复制填充。
具体来说:
class Foo {
public:
int m_value;
char m_word = 'a';
};
将复制 3 个字节的填充。
class Foo {
public:
IntContainer m_int;
char m_word = 'a';
};
不会复制填充。IntContainer
具有 int 的公共成员和用户提供的复制构造函数。
这是特定于平台还是特定于编译器的事情?在程序集级别,此按位复制语义与按成员复制有什么区别?
这是特定于平台还是特定于编译器的事情?
就语言而言,它是特定于语言实现的。编译器可以根据平台做出不同的选择,不同的编译器可以对同一平台做出不同的选择。