c - 为什么编译器内联函数不写在不同的源文件上?

标签 c function compilation inline

我一直在使用 Valgrind 进行一些测试,以了解编译器如何翻译函数,并且发现,有时,由于未内联,在不同文件上编写的函数与在同一源文件上编写的函数相比,性能较差。

考虑到我有不同的文件,每个文件都包含与特定区域相关的函数,并且所有文件共享一个声明所有函数的公共(public) header ,这是预期的吗?

为什么编译器在将它们写入不同文件时不内联它们,但在将它们写入同一页面时却内联它们?

如果此行为开始导致性能问题,建议的操作过程是什么,在编译之前手动将所有函数放在同一个文件中?

示例:

//source 1
    void foo(char *str1, char *str2)
    {
        //here goes the code
    }

//source 2
    void *bar(int something, char *somethingElse)
    {
        //bar code
        foo(variableInsideBar, anotherVariableCreatedInsideBar);
        return variableInsideBar;
    }

性能成本示例:

在不同文件上:29920

两者都在同一个文件上:8704

对于更大的函数,它并不那么明显,但仍然会发生。

最佳答案

如果您使用的是gcc,您应该尝试选项-combine-fwhole-program并将所有源文件传递给编译器在一次调用中。传统上不同的C文件是单独编译的,但优化交叉编译单元(文件)变得越来越普遍。

关于c - 为什么编译器内联函数不写在不同的源文件上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19071933/

相关文章:

c - 根据用户的输入结束循环

javascript - TypeScript myFunction 不是函数

c++ - sublime text C++ 编译导致段错误

c - 使用 Win32 API 将自定义边框添加到另一个应用程序

c++ - 如何在输入 '#' 时禁用建议

c - 从一个文件读取并打印到另一个文件

c++ - 如何为 C++ 和 proje 编写 makefile

c++ - 在 Mac 上使用 intel 编译器编译 C++ 代码时出现错误 : expected an identifier

将 malloc 的结果转换为 char(不是 char*)——为什么编译器不报错?

c - 从 dev/urandom 获取真正随机的数据