填充中编译器生成的复制构造函数之间的不一致

Posted

技术标签:

【中文标题】填充中编译器生成的复制构造函数之间的不一致【英文标题】:inconsistency between complier generated copy constructors on padding 【发布时间】:2020-06-29 20:36:28 【问题描述】:

我使用的是 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 的公共成员和一个用户提供的复制构造函数。

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

【问题讨论】:

您构建的是“发布”版本还是未优化的“调试”版本? 你不能编写一个可以区分的符合标准的程序,所以任何一种方式都可以。即使在同一个程序中以不同的方式进行...... 大概IntContainer 不是 POD,所以适用不同的规则 另外,see this program。看看std::is_trivially_copyable用来测试时的结果。现在,如果编译器报告一个类是可简单复制的,但仍然没有进行按位复制(可能使用memcpy),那么这将是一个问题。 @TedLyngmo -- 也许;但是这样做之后,填充字节的内容仍未指定。不要求它们保持一致,即使在对同一对象的两次单独检查之间也是如此。 (是的,这与我之前所说的不同) 【参考方案1】:

这是特定于平台还是特定于编译器的事情?

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

【讨论】:

以上是关于填充中编译器生成的复制构造函数之间的不一致的主要内容,如果未能解决你的问题,请参考以下文章

第五篇:明确拒绝不想编译器自动生成的拷贝构造函数和赋值运算符重载函数

C++ 类的复制控制

构造函数

构造函数

c++,类的对象作为形参时一定会调用复制构造函数吗?

复制构造函数相关的编译器错误