复制成数组时的memcpy vs分配;为什么这会生成不同的代码
memcpy vs assignment when copying into an array; why does this generate different code?
编译以下代码时,
#include <cstring>
struct X { char a, b, c, d; };
void copy_assignment(char* p, X x) {
*p++ = x.a;
*p++ = x.b;
*p++ = x.c;
*p++ = x.d;
}
void copy_memcpy(char* p, X x) {
memcpy(p, &x, sizeof(X));
}
GCC和Clang均给copy_assignment
发出一系列MOVB指令,同时为copy_memcpy
发出单个MOVL指令。假设X
没有填充物,它在这里不在,这两个都不应该等效,并且不是一个更有效的填充物吗?
确切地说,我正在编译:
g++ -O3 -S -o prog.S prog.cpp
和clang的同上。GCC版本为7.1.1,Clang版本为4.0.1。使用-o2,-os和-ofast给出相同的结果。
答案不一定是。正如您所说,编译器和版本之间的区别可能保持不变。但是查看GCC的中继版本的答案是输出与编译器资源管理器中看到的相同。
相关文章:
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 为什么代码给出分段错误?
- 不理解为什么代码没有产生所需的答案
- 为什么代码段会引发浮点异常?
- 我不确定为什么代码没有运行,它在编译时抛出错误,说它无法找到 PrintArray()
- 为什么代码会崩溃?(在CPP中)
- 为什么代码使用 std::map 无法编译?
- 为什么代码会抛出非法内存访问错误
- 为什么代码不能返回正确的值?
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 为什么代码告诉我vectorsubsibrtion超出了范围
- 字符指针值为空白,为什么代码不打印5
- 为什么代码中没有处理每个逗号字符?
- 为什么代码在输入大于10的输入上会分割故障
- 为什么C++代码不起作用(strncpy_s)?
- 为什么代码无法打印此 2D 数组的元素?
- 为什么代码没有cout?
- 为什么代码中的模板参数推导/替换失败?-.
- 为什么代码在 c++ 中无法正常运行
- 在C++中,为什么代码示例在重载运算符时经常使用内存位置