c++ - 不理解以下关于编译器可能对普通 {} 定义执行 `memcpy` 优化的评论
问题描述
我不太明白@goodbyeera 和@user743382在SO中的这个答案中的以下两条评论。
@hvd:从这个意义上说,编译器不会也
memcpy
为普通{}
定义执行优化吗?
@goodbyeera 这是允许的,但编译器可能更难检测到它是可能的。复制构造函数体中的逐字段赋值可能会让编译器看起来好像它应该避免复制任何内部填充字节。
解决方案
为什么更难检测到这是一种选择?填充字节与此有什么关系?
假设您有以下类定义:
class Foo
{
char a;
int b;
public:
Foo (const Foo& other)
{
a = other.a;
b = other.b;
}
};
现在,如果您允许编译器合成一个默认的复制构造函数,它很可能会将其实现为 8-byte ,因为它知道andmemcpy
之间的填充字节(为了对齐目的而插入)并不重要。说将被内联并且可能是2个机器指令。a
b
memcpy
但是,使用如图所示的用户定义的复制构造函数,编译器可能会想,“哦,看,他正在单独复制每个成员变量,我最好尊重这一点”,因此会生成次优代码。无论是否,您都可以在Godbolt上进行测试(我没有,抱歉)。
推荐阅读
- javascript - 为什么这告诉我我的 var 未定义?
- javascript - Stripe.js - 无法更改信用卡输入的背景颜色或高度
- flutter - Flutter state outside State object
- php - 在 ubuntu 上安装 phpmyadmin 后用户 'root'@'localhost' 的访问被拒绝
- javascript - 计算在 C# 和 javascript 之间显示的结果不同
- tensorflow - 使用 tflite_convert 为 Coral 转换 tfLite 的 Frozen 图
- java - 如何使字符串在其他类中可用
- r - 如何在 R 中使用 metafor 为荟萃分析找到单个合并效应大小?
- python - 如何解压列表元组
- python - Python:从字典到 csv,通过值的长度复制键