相关疑难解决方法(0)

如何告诉gcc不要内联函数?

假设我在源文件中有这个小功能

static void foo() {}
Run Code Online (Sandbox Code Playgroud)

我构建了二进制文件的优化版本,但我不希望这个函数内联(出于优化目的).我可以在源代码中添加一个宏来阻止内联吗?

c gcc inline

115
推荐指数
7
解决办法
10万
查看次数

功能序言和结语由GCC优化删除

采取一个空的程序

//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优化?

为什么主函数,不需要堆栈帧初始化?

如果没有在主函数内设置帧指针,那么谁来完成这项工作呢?

它是由操作系统完成还是硬件的功能?

c optimization x86 assembly gcc

5
推荐指数
1
解决办法
1902
查看次数

标签 统计

c ×2

gcc ×2

assembly ×1

inline ×1

optimization ×1

x86 ×1