首页 > 解决方案 > 编译器生成的填充复制构造函数之间的不一致

问题描述

我使用的是 x86 下的 Visual Studio 2019 社区版。使用按位复制语义的编译器生成的 Copy 构造函数倾向于复制填充。而编译器生成的不使用按位复制语义的复制构造函数往往会忽略填充。而编译器生成的复制赋值运算符总是复制填充。

再具体一点:

class Foo {
public:
    int m_value;
    char m_word = 'a';
};

将复制 3 个字节的填充。

class Foo {
public:
    IntContainer m_int;
    char m_word = 'a';
};

不会复制填充。IntContainer具有 int 的公共成员和用户提供的复制构造函数。

这是特定于平台的还是特定于编译器的东西?这种按位复制语义与程序集级别的成员复制有什么区别?

标签: c++copy-constructor

解决方案


这是特定于平台的还是特定于编译器的东西?

就语言而言,它是特定于语言实现的。编译器可以根据平台做出不同的选择,不同的编译器可以针对同一平台做出不同的选择。


推荐阅读