我想研究某些 C/C++ 特性是如何转换为程序集的,我创建了以下文件:
struct foo {
int x;
char y[0];
};
char *bar(struct foo *f)
{
return f->y;
}
然后我用gcc -S
(也试过用g++ -S
)编译了这个,但是当我查看汇编代码时,我很失望地发现 bar 函数中有一个微不足道的冗余,我认为gcc
应该能够优化掉:
_bar:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movabsq $4, %rcx
addq %rcx, %rax
movq %rax, -24(%rbp)
movq -24(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
popq %rbp
ret
Leh_func_end1:
除其他外,线条
movq %rax, -24(%rbp)
movq -24(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
看起来毫无意义的多余。gcc(可能还有其他编译器)有什么理由不能/不优化这个吗?