gcc 的链接器能否将 C header 中静态函数的多个实例化折叠成单个实例?
Can gcc's linker fold multiple instantiations of a static function in a C header into a single instance?
我正在编写的嵌入式 C 代码在 headers 中定义了许多(即 >100)小型静态访问器函数,但我不愿意将它们移出 headers因为整体代码清晰度会受到影响。 :-(
gcc 的链接器是否足够智能,可以将 header-defined 静态函数的多个实例折叠成最终二进制文件中的单个实例?更一般地说,C 标准是否为 header 中定义的静态函数的多个相同实例定义了链接器行为?谢谢!
准确地说:如果 headers 中定义的静态函数引用静态数据,那么我可以看到链接器将无法将多个实例化折叠在一起,因为每个函数实例将引用不同的该静态数据的实例。但是,在 header 中定义的静态函数不引用静态数据的情况下,编译后的实例化基本上是相同的(除了不可避免的编译器 static-naming kruft 环绕它们)。这就是为什么我问 gcc 的链接器 "smart" 是否足够。 :-)
Gold 和 lld 链接器执行相同的代码折叠(因此幸运的是所有本地定义都将被合并)但 GNU ld 不会,因此最好的方法是将 static
替换为 inline
(保证合并重复的 inline
个定义。
我正在编写的嵌入式 C 代码在 headers 中定义了许多(即 >100)小型静态访问器函数,但我不愿意将它们移出 headers因为整体代码清晰度会受到影响。 :-(
gcc 的链接器是否足够智能,可以将 header-defined 静态函数的多个实例折叠成最终二进制文件中的单个实例?更一般地说,C 标准是否为 header 中定义的静态函数的多个相同实例定义了链接器行为?谢谢!
准确地说:如果 headers 中定义的静态函数引用静态数据,那么我可以看到链接器将无法将多个实例化折叠在一起,因为每个函数实例将引用不同的该静态数据的实例。但是,在 header 中定义的静态函数不引用静态数据的情况下,编译后的实例化基本上是相同的(除了不可避免的编译器 static-naming kruft 环绕它们)。这就是为什么我问 gcc 的链接器 "smart" 是否足够。 :-)
Gold 和 lld 链接器执行相同的代码折叠(因此幸运的是所有本地定义都将被合并)但 GNU ld 不会,因此最好的方法是将 static
替换为 inline
(保证合并重复的 inline
个定义。