Trước tiên hãy xem ví dụ này:
Mã C cho một chương trình C đơn giản được đưa ra dưới đây
struct Foo {
char a;
int b;
double c;
} foo1,foo2;
void foo_assign(void)
{
foo1 = foo2;
}
int main(/*char *argv[],int argc*/)
{
foo_assign();
return 0;
}
Mã ASM tương đương cho foo_assign () là
00401050 <_foo_assign>:
401050: 55 push %ebp
401051: 89 e5 mov %esp,%ebp
401053: a1 20 20 40 00 mov 0x402020,%eax
401058: a3 30 20 40 00 mov %eax,0x402030
40105d: a1 24 20 40 00 mov 0x402024,%eax
401062: a3 34 20 40 00 mov %eax,0x402034
401067: a1 28 20 40 00 mov 0x402028,%eax
40106c: a3 38 20 40 00 mov %eax,0x402038
401071: a1 2c 20 40 00 mov 0x40202c,%eax
401076: a3 3c 20 40 00 mov %eax,0x40203c
40107b: 5d pop %ebp
40107c: c3 ret
Như bạn có thể thấy rằng một phép gán được thay thế đơn giản bằng lệnh "Mov" trong cụm, toán tử gán chỉ đơn giản có nghĩa là di chuyển dữ liệu từ một vị trí bộ nhớ sang một vị trí bộ nhớ khác. Nhiệm vụ sẽ chỉ làm điều đó cho các thành viên trực tiếp của một cấu trúc và sẽ không sao chép khi bạn có các kiểu dữ liệu phức tạp trong một cấu trúc. Ở đây COMPLEX có nghĩa là bạn không thể có mảng con trỏ, trỏ đến danh sách.
Bản thân một mảng các ký tự trong một cấu trúc sẽ không hoạt động trên hầu hết các trình biên dịch, điều này là do phép gán sẽ đơn giản cố gắng sao chép mà không cần nhìn vào kiểu dữ liệu có kiểu phức tạp.