【问题标题】:Optimization of template vs regular function: what's going on under the hood?模板与常规函数的优化:幕后发生了什么?
【发布时间】:2015-01-26 17:53:16
【问题描述】:

this question 的回答中,我发现了一个相当有趣的现象。给定以下两个函数:

void require(void * volatile) { }

template <typename T>
void requireT(T * volatile) { }

使用指向静态数据成员的指针调用每个成员将强制实例化该成员(这是另一个问题的目的),但是,requireT 将被完全优化掉,而@​​987654324@ 会影响生成的代码/二进制文件 (g++ 4.9.2)。

这是为什么?编译器对代码的处理方式有什么不同?

【问题讨论】:

  • 什么是“影响”?请注意,非模板不是内联的,而模板是隐式内联的。
  • @Potatoswatter 隐式内联的模板函数是关键。您想将您的评论转换为答案吗?谢谢!

标签: c++ templates g++ volatile


【解决方案1】:

模板隐含inline,但其他函数不是。

链接器可能假定未使用的inline 函数不需要包含在编译的二进制文件中,因为任何客户端代码都可以在头文件中找到它。 (但通常,在生成可执行应用程序二进制文件时,所有未使用的函数都会被剥离。)

【讨论】:

    【解决方案2】:

    模板代码是在需要的地方生成的,因为事先为每个可能使用的类型生成它是不可行的。因为当对模板函数的调用被优化掉时,编译器没有理由生成它自己的函数。

    即使对它们的所有调用都已优化掉,也几乎总是会生成普通函数,因为它们也可能从不同的编译单元调用。通过将静态函数放在编译单元之前或将其放在未命名的命名空间中来使函数成为编译单元的本地函数可能有助于编译器完全优化函数。

    【讨论】:

      猜你喜欢
      • 2011-10-19
      • 1970-01-01
      • 2021-01-12
      • 2010-09-06
      • 2011-07-12
      • 1970-01-01
      • 2018-03-29
      • 2019-06-05
      • 2019-08-03
      相关资源
      最近更新 更多