movl $4, %edx
movq %rcx, %rsi
movq %rax, %rdi
call memcpy
movq -40(%rbp), %rax
leaq 8(%rax), %rcx
movq -24(%rbp), %rax
movl $4, %edx
movq %rcx, %rsi
movq %rax, %rdi
call memcpy
movq -40(%rbp), %rax
leaq 12(%rax), %rcx
movq -32(%rbp), %rax
movl $4, %edx
movq %rcx, %rsi
movq %rax, %rdi
call memcpy
movl $0, %eax
L3段是我们的主段落,对a的赋值:
24-28行都是在“压栈”,为了memcpy函数内取出来,加上29行一共是6条,memcpy 解栈指令数>=3, 去处指令数>=4,不加算返回指令,一共指令数>6+3+4=13。
parse_package2汇编代码:
[cpp]
parse_package2:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -24(%rbp)
movq %rsi, -32(%rbp)
movq %rdx, -40(%rbp)
movq %rcx, -48(%rbp)
movq %r8, -56(%rbp)
movl %r9d, -60(%rbp)
cmpq $0, -56(%rbp)
je .L7
cmpl $15, -60(%rbp)
jg .L8
.L7:
movl $-1, %eax
jmp .L9
.L8:
movq -56(%rbp), %rax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
movl (%rax), %edx
movq -24(%rbp), %rax
movl %edx, (%rax)
movq -8(%rbp), %rax
addq $4, %rax
movl (%rax), %edx
movq -32(%rbp), %rax
movl %edx, (%rax)
movq -8(%rbp), %rax
addq $8, %rax
movl (%rax), %edx
movq -40(%rbp), %rax
movl %edx, (%rax)
movq -8(%rbp), %rax
addq $12, %rax
movl (%rax), %edx
movq -48(%rbp), %rax
movl %edx, (%rax)
movl $0, %eax
parse_package2:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movq %rdi, -24(%rbp)
movq %rsi, -32(%rbp)
movq %rdx, -40(%rbp)
movq %rcx, -48(%rbp)
movq %r8, -56(%rbp)
movl %r9d, -60(%rbp)
cmpq $0, -56(%rbp)
je .L7
cmpl $15, -60(%rbp)
jg .L8
.L7:
movl $-1, %eax
jmp .L9
.L8:
movq -56(%rbp), %rax
movq %rax, -8(%rbp)
movq -8(%rbp), %rax
movl (%rax), %edx
movq -24(%rbp), %rax
movl %edx, (%rax)
movq -8(%rbp), %rax
addq $4, %rax
movl (%rax), %edx
movq -32(%rbp), %rax
movl %edx, (%rax)
movq -8(%rbp), %rax
addq $8, %rax
movl (%rax), %edx
movq -40(%rbp), %rax
movl %edx, (%rax)
movq -8(%rbp), %rax
addq $12, %rax
movl (%rax), %edx
movq -48(%rbp), %rax
movl %edx, (%rax)
movl $0, %eax
L8是主段落,对a的赋值:
26-29行,一共4行解决。
这个例子中强制转换(parse_package2) 比内存复制(parse_package)要少2倍的CPU指令,性能至少可以提高2倍。
因此,我们的开发中应该尽量减少对内存复制的使用,而应该采用强制转换,现在64位服务器上,我们甚至可以用8个字节的long,下面的例子:
[cpp]
long lv;
char buffer[ 8 ];
memcpy( &lv, buffer, 8 );
lv = *(int*)(buffer);
long lv;
char buffer[ 8 ];
memcpy( &lv, buffer, 8 );
lv = *(in