在 C 中,如果我有一个看起来像的函数调用
// main.c
...
do_work_on_object(object, arg1, arg2);
...
// object.c
void do_work_on_object(struct object_t *object, int arg1, int arg2)
{
if(object == NULL)
{
return;
}
// do lots of work
}
然后编译器将在 main.o 中生成很多东西来保存状态、传递参数(希望在这种情况下在寄存器中)和恢复状态。
但是,在链接时可以观察到 arg1 和 arg2 没有用于快速返回路径,因此可以将清理和状态恢复短路。链接器是否倾向于自动执行此类操作,或者是否需要打开链接时优化 (LTO) 才能使此类操作正常工作?
(是的,我可以检查反汇编代码,但我对编译器和链接器的一般行为以及多种架构感兴趣,因此希望从其他人的经验中学习。)
假设分析表明这个函数调用值得优化,我们是否应该期望下面的代码明显更快(例如,不需要使用 LTO)?
// main.c
...
if(object != NULL)
{
do_work_on_object(object, arg1, arg2);
}
...
// object.c
void do_work_on_object(struct object_t *object, int arg1, int arg2)
{
assert(object != NULL) // generates no code in release build
// do lots of work
}