2017-08-31 22 views
8

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ự.

+3

Vì cấu trúc không phải là mảng – StoryTeller

+4

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? –

+0

Khác nhau không giống nhau. - Fred Picker –

Trả lời

0

Câu trả lời không nhất thiết. Như bạn đã nói, sự khác biệt giữa các trình biên dịch và phiên bản có thể vẫn giữ nguyên. Nhưng nhìn vào phiên bản thân của gcc câu trả lời là đầu ra giống như được thấy in compiler explorer.

Các vấn đề liên quan