Khi biên dịch đoạn mã sau,memcpy vs gán khi sao chép vào một mảng; tại sao điều này tạo ra mã khác nhau?
#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));
}
cả GCC và kêu vang phát ra một một loạt các hướng dẫn movb cho copy_assignment
, trong khi phát ra một hướng dẫn movl duy nhất cho copy_memcpy
. Giả sử X
không có đệm, mà nó không ở đây, không nên hai là tương đương, và không phải là một movl đơn hiệu quả hơn?
Để được chính xác, tôi đang biên soạn với:
g++ -O3 -S -o prog.S prog.cpp
và idem cho kêu vang. Phiên bản GCC là 7.1.1, phiên bản Clang là 4.0.1. Sử dụng -O2, -Os và -Ofast cho kết quả tương tự.
Vì cấu trúc không phải là mảng – StoryTeller
Thêm công tắc biên dịch. Và _ "... Giả sử X không có đệm ..." _ tại sao lại giả sử điều này? –
Khác nhau không giống nhau. - Fred Picker –