Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux内核中使用类型限定符inline的时间_C_Linux - Fatal编程技术网

C 在Linux内核中使用类型限定符inline的时间

C 在Linux内核中使用类型限定符inline的时间,c,linux,C,Linux,Linux内核开发人员在Linux内核中大量使用内联类型限定符。 如果使用得当,它可以降低函数调用的成本。 如果不好,它可能会将图像大小放大太多,从而增加内存访问的成本 他们如何判断何时使用内联类型限定符?内联作用的详细信息特定于编译器。特定于编译器的扩展,如_属性_始终_内联或_强制内联,可能更有用,因为它们具有更强和更可预测的效果 例如,对于Clang,如果函数的成本低于阈值,则函数将内联。对于没有任何内联属性的函数,阈值设置为225,但对于优化级别-Os、-O2和-O3,阈值分别乘以0.3

Linux内核开发人员在Linux内核中大量使用内联类型限定符。 如果使用得当,它可以降低函数调用的成本。 如果不好,它可能会将图像大小放大太多,从而增加内存访问的成本

他们如何判断何时使用内联类型限定符?

内联作用的详细信息特定于编译器。特定于编译器的扩展,如_属性_始终_内联或_强制内联,可能更有用,因为它们具有更强和更可预测的效果

例如,对于Clang,如果函数的成本低于阈值,则函数将内联。对于没有任何内联属性的函数,阈值设置为225,但对于优化级别-Os、-O2和-O3,阈值分别乘以0.333、1.500或1.667。使用inline时,阈值设置为487。因此,在使用较低级别编译时,尤其是使用-Os 75 vs 487阈值时,效果更为明显。您可以随时检查和试验Clang的优化输出

编译器不需要内联关键字来内联函数。尽管仍然存在某些函数禁用内联的情况,除非使用内联关键字。For GCC在构建共享对象时不会内联在ELF目标上具有默认可见性的函数-fPIC标志,除非指定了-fno语义插入


最常见的建议是分析代码,但我觉得它不是很有用,因为您无法检查所有函数上所有可能的内联关键字组合。这一切都来自经验:C程序员通常知道编译器生成的代码是什么样子的,他们也知道最终想要得到什么代码

目前,C语言内联的主要目标是:

抑制来自标头的未使用静态内联函数的警告 实现外部内联函数。 可以操纵铿锵内联-内联阈值和-内联提示阈值


< C++ >内联具有额外的含义-内联函数生成弱符号,其中的重复必须由链接器移除。在某些情况下,函数被视为隐式标记为inline,但仅在语义上标记为inline。进一步添加inline关键字将内联阈值至少从正常级别提高到内联级别。

我建议依赖编译器优化。选项-finline函数是通过-O2、-O3、-Os启用的,这将以更好的方式为我们管理它。在这里你可以阅读更多有关它的内容:我建议阅读:亚历克斯链接是C++的,而问题是C。两个WRT的内联有很大的区别。C程序员通常知道编译器生成的代码是什么样子,他们也知道他们最终想要得到什么代码。