【问题标题】:Inline functions and link time optimizations内联函数和链接时间优化
【发布时间】:2020-08-24 08:27:36
【问题描述】:

我正在尝试研究内联和链接时优化的效果,目前我正在尝试链接两个文件,其中一个文件具有显式内联函数调用

以下是文件:

test.c

void show(int *arr,int n ){

  for(int i=0;i<n;i++)
printf("%d",arr[i]);
 
}


int main(){

  int arr[10]={0};
  foo(arr);

}

test1.c

inline void foo(int *arr){
 
   show(arr,10);
}

所以我试图将它们编译为

gcc -c -O2 -flto test.c
gcc -c -O2 -flto test1.c
gcc -o myprog -flto -O2 test1.o test.o

但这仍然会产生链接器错误,就像在 main 中未定义对 foo 的引用一样

我编译正确了吗? gcc 是否无法内联?

任何帮助将不胜感激

【问题讨论】:

    标签: gcc clang compiler-optimization llvm-gcc lto


    【解决方案1】:

    来自C11 6.7.4p7强调我的:

    任何具有内部链接的函数都可以是内联函数。为一个 具有外部链接的功能,以下限制适用:如果 函数是用内联函数说明符声明的,那么它应该 也被定义在同一个翻译单元中。如果所有文件范围 翻译单元中函数的声明包括内联 没有extern的函数说明符,然后是那个中的定义 翻译单元是一个内联定义。 内联定义 不提供函数的外部定义,并且不 禁止在另一个翻译单元中进行外部定义。内联 定义提供了外部定义的替代方案,外部定义 翻译器可以用来实现对同一函数的任何调用 翻译单元。未指定是否调用该函数 使用内联定义或外部定义

    您的代码没有提供带有外部链接的foo 的定义,并且编译器是正确的 - 没有footest1.c 中的foo 是一个内联函数,它不提供外部定义的函数。

    我编译正确了吗?

    嗯,是的。

    gcc 是否无法内联?

    编译失败,所以是的。

    关键字inline可以作为提示让编译器可能内联函数。没有要求编译器会这样做。 inline 是一个误导性的关键字——它主要用于修改对象的链接,以便让编译器在同一事务单元中可用的同一函数的内联和非内联版本之间进行选择。这并不意味着该函数将被内联。

    如果您使用的是 LTO,只需删除内联,提示 编译器没有任何意义 - 相信 gcc 它会比您做得更好,使用 LTO 它会“看到” " 无论如何,单个事务单元中的所有功能。另请阅读gcc docs on inline 并记住rules of optimization

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 2021-12-25
      • 2016-12-09
      • 2012-10-02
      相关资源
      最近更新 更多