Fig*_*igo 4 c++ optimization gcc g++
嗨,我有一个关于gcc(或g ++)可能的堆栈优化的问题..
FreeBSD下的示例代码(这里的UNIX差异是否重要?):
void main() {
char bing[100];
..
string buffer = ....;
..
}
Run Code Online (Sandbox Code Playgroud)
我在gdb中找到的这个程序的coredump是bing的地址实际上低于那个缓冲区(即&bing [0] <&buffer).
我认为这完全与教科书中的相反.是否有一些编译器优化以这种方式重新组织堆栈布局?
这似乎只是可能的解释,但我不确定..
如果你感兴趣的话,coredump是由于bing缓冲区溢出缓冲区(但这也确认了&bing [0] <&buffer).
谢谢!
编译器可以按照自己的意愿自由组织堆栈帧(假设它们甚至使用堆栈).
他们可能出于协调原因,出于性能原因,或者根本没有任何理由这样做.假设任何特定的订单你是不明智的.
如果你没有通过溢出缓冲区来调用未定义的行为,那么你可能永远都不会知道,这应该是它应该的样子.
编译器不仅可以重新组织您的变量,如果它们可以确定它们未被使用,它可以优化它们.随着代码:
#include <stdio.h>
int main (void) {
char bing[71];
int x = 7;
bing[0] = 11;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
比较正常的汇编程序输出:
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $80, %esp
movl %gs:20, %eax
movl %eax, 76(%esp)
xorl %eax, %eax
movl $7, (%esp)
movb $11, 5(%esp)
movl $0, %eax
movl 76(%esp), %edx
xorl %gs:20, %edx
je .L3
call __stack_chk_fail
.L3:
leave
ret
Run Code Online (Sandbox Code Playgroud)
疯狂优化:
main:
pushl %ebp
xorl %eax, %eax
movl %esp, %ebp
popl %ebp
ret
Run Code Online (Sandbox Code Playgroud)
注意后者缺少什么?是的,有没有栈操作,为无论是创造空间bing
或x
.它们不存在.实际上,整个代码序列归结为:
编译器可以自由地在堆栈上布局局部变量(或者将它们保存在寄存器中或对它们执行其他操作)但是它认为合适:C和C++语言标准没有说明这些实现细节,POSIX或UNIX.我怀疑你的教科书告诉过你,如果确实如此,我会寻找一本新的教科书.