首页 > 解决方案 > 不理解以下关于编译器可能对普通 {} 定义执行 `memcpy` 优化的评论

问题描述

我不太明白@goodbyeera 和@user743382在SO中的这个答案中的以下两条评论。

@goodbyeera 的评论

@hvd:从这个意义上说,编译器不会也memcpy 为普通{}定义执行优化吗?

@user743382评论

@goodbyeera 这是允许的,但编译器可能更难检测到它是可能的。复制构造函数体中的逐字段赋值可能会让编译器看起来好像它应该避免复制任何内部填充字节。

标签: c++

解决方案


为什么更难检测到这是一种选择?填充字节与此有什么关系?

假设您有以下类定义:

class Foo
{
    char a;
    int b;

public:
    Foo (const Foo& other)
    {
        a = other.a;
        b = other.b;
    }
};

现在,如果您允许编译器合成一个默认的复制构造函数,它很可能会将其实现为 8-byte ,因为它知道andmemcpy之间的填充字节(为了对齐目的而插入)并不重要。说将被内联并且可能是2个机器指令。abmemcpy

但是,使用如图所示的用户定义的复制构造函数,编译器可能会想,“哦,看,他正在单独复制每个成员变量,我最好尊重这一点”,因此会生成次优代码。无论是否,您都可以在Godbolt上进行测试(我没有,抱歉)。


推荐阅读