内联函数和 link 时间优化

Inline functions and link time optimizations

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

以下是文件:

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

但这仍然会给出一个 linker 错误,如 undefined reference to foo in main

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

如有任何帮助,我们将不胜感激

来自 C11 6.7.4p7 强调我的:

Any function with internal linkage can be an inline function. For a function with external linkage, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern, then the definition in that translation unit is an inline definition. An inline definition does not provide an external definition for the function, and does not forbid an external definition in another translation unit. An inline definition provides an alternative to an external definition, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition or the external definition

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

Did I compile it correctly?

嗯,是的。

Is gcc failing to inline?

编译失败,是的。

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

如果您正在使用 LTO,只需删除内联,提示 编译器没有意义 - 相信 gcc 它会比您更好地优化无论如何,LTO 都会“看到”单个交易单元中的所有功能。另请阅读 gcc docs on inline and remember about the rules of optimization.