代码节选
typedef struct student {
long long stu_id;
char *stu_name;
char *info;
char *pos;
char *email;
char home[1024];
} t_student;
t_student s1,s2 ;
s1.stu_name ="Guess my name" ;
s2 = s1 ;
跟踪生成的目标码
0x0000000000400883 <+129>: mov rax,QWORD PTR [rbp-0x90]
0x000000000040088a <+136>: mov rdx,QWORD PTR [rbp-0x88]
0x0000000000400891 <+143>: mov QWORD PTR [rbp-0x120],rax
0x0000000000400898 <+150>: mov QWORD PTR [rbp-0x118],rdx
0x000000000040089f <+157>: mov rax,QWORD PTR [rbp-0x80]
0x00000000004008a3 <+161>: mov rdx,QWORD PTR [rbp-0x78]
0x00000000004008a7 <+165>: mov QWORD PTR [rbp-0x110],rax
0x00000000004008ae <+172>: mov QWORD PTR [rbp-0x108],rdx
0x00000000004008b5 <+179>: mov rax,QWORD PTR [rbp-0x70]
0x00000000004008b9 <+183>: mov rdx,QWORD PTR [rbp-0x68]
0x00000000004008bd <+187>: mov QWORD PTR [rbp-0x100],rax
0x00000000004008c4 <+194>: mov QWORD PTR [rbp-0xf8],rdx
0x00000000004008cb <+201>: mov rax,QWORD PTR [rbp-0x60]
0x00000000004008cf <+205>: mov rdx,QWORD PTR [rbp-0x58]
0x00000000004008d3 <+209>: mov QWORD PTR [rbp-0xf0],rax
0x00000000004008da <+216>: mov QWORD PTR [rbp-0xe8],rdx
0x00000000004008e1 <+223>: mov rax,QWORD PTR [rbp-0x50]
0x00000000004008e5 <+227>: mov rdx,QWORD PTR [rbp-0x48]
0x00000000004008e9 <+231>: mov QWORD PTR [rbp-0xe0],rax
0x00000000004008f0 <+238>: mov QWORD PTR [rbp-0xd8],rdx
0x00000000004008f7 <+245>: mov rax,QWORD PTR [rbp-0x40]
0x00000000004008fb <+249>: mov rdx,QWORD PTR [rbp-0x38]
0x00000000004008ff <+253>: mov QWORD PTR [rbp-0xd0],rax
0x0000000000400906 <+260>: mov QWORD PTR [rbp-0xc8],rdx
0x000000000040090d <+267>: mov rax,QWORD PTR [rbp-0x30]
0x0000000000400911 <+271>: mov rdx,QWORD PTR [rbp-0x28]
0x0000000000400915 <+275>: mov QWORD PTR [rbp-0xc0],rax
0x000000000040091c <+282>: mov QWORD PTR [rbp-0xb8],rdx
0x0000000000400923 <+289>: mov rax,QWORD PTR [rbp-0x20]
0x0000000000400927 <+293>: mov rdx,QWORD PTR [rbp-0x18]
0x000000000040092b <+297>: mov QWORD PTR [rbp-0xb0],rax
0x0000000000400932 <+304>: mov QWORD PTR [rbp-0xa8],rdx
0x0000000000400939 <+311>: mov rax,QWORD PTR [rbp-0x10]
0x000000000040093d <+315>: mov rdx,QWORD PTR [rbp-0x8]
0x0000000000400941 <+319>: mov QWORD PTR [rbp-0xa0],rax
0x0000000000400948 <+326>: mov QWORD PTR [rbp-0x98],rdx
观察情况
从生成的目标码可得出,如果是大结构体,那么目标变长
代码等价改写
int struct_assign(void * dst,void * src,int qwds,int bytes)
{
asm("push %rcx");
asm("mov %rdx,%rcx");
asm("repz movsq (%rsi),(%rdi)") ;
asm("pop %rcx");
asm("repz movsb (%rsi),(%rdi)") ;
}