假设我在源文件中有这个小功能
static void foo() {}
Run Code Online (Sandbox Code Playgroud)
我构建了二进制文件的优化版本,但我不希望这个函数内联(出于优化目的).我可以在源代码中添加一个宏来阻止内联吗?
采取一个空的程序
//demo.c
int main(void)
{
}
Run Code Online (Sandbox Code Playgroud)
在默认优化时编译程序.
gcc -S demo.c -o dasm.asm
Run Code Online (Sandbox Code Playgroud)
我得到汇编输出为
//Removed labels and directive which are not relevant
main:
pushl %ebp // prologue of main
movl %esp, %ebp // prologue of main
popl %ebp // epilogue of main
ret
Run Code Online (Sandbox Code Playgroud)
现在在-O2优化时编译程序.
gcc -O2 -S demo.c -o dasm.asm
Run Code Online (Sandbox Code Playgroud)
我得到了优化的装配
main:
rep
ret
Run Code Online (Sandbox Code Playgroud)
在我最初的搜索中,我发现优化标志-fomit-frame-pointer负责删除序言和结尾.
我在gcc编译器手册中找到了有关该标志的更多信息.但是,由于手册的原因,我无法理解下面的原因,用于删除序言和结尾.
不要将帧指针保存在寄存器中以查找不需要的函数.
出于上述原因,还有其他方法吗?
"rep"
教学的原因是什么,出现在-02优化?
为什么主函数,不需要堆栈帧初始化?
如果没有在主函数内设置帧指针,那么谁来完成这项工作呢?
它是由操作系统完成还是硬件的功能?