关于c/c++ 大struct赋值语句生成的目标码分析

代码节选

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)") ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值