0

我有一个简单的模板头,其中包含 3 个模板函数(没有声明,只有定义和标记static inline),其中两个函数有 5000 行长。这些长函数非常简单,但是很长,因为它们是紧张的程序形式/没有循环。在我使用模板实例化的主程序文件中,如果我直接包含模板文件,则程序运行速度比我构建一个单独的 c++ 文件以包含模板并实例化它并作为链接链接到它的速度慢约 10 倍静态库(-fPIC使用)。为什么?

是编译器太慢,指令缓存被弄乱了,编译器突然内联了不应该的长函数,还是其他什么?

代码经过高度优化,-O3 -ffast-math -march=native -std=gnu++11在 Mac OS 10.14.3 中使用标志编译:和 GCC 5.5.0。

4

2 回答 2

0

编译主程序时忽略了优化标志,可能是 CMake 错误。当将模板实例化单独编译为库时,使用了优化标志,导致程序运行速度很快。我通过直接包含模板强制在主程序中使用优化标志,它现在运行速度一样快。

出于好奇:inlineandstatic关键字是无害的——删除它们并不会改变速度。事实上,尽管有我的提示,编译器并没有内联函数,因为它知道什么时候不应该。使用强制内联__attribute__((always_inline))会使编译非常慢,并且运行时性能也会降低一点(2 倍)。

于 2019-03-15T16:09:29.563 回答
0

如果您将函数模板声明为静态,这不会导致每个翻译单元(编译的目标文件)生成一份它的副本吗?这可能会导致生成该方法的 3 个副本,是的,缓存问题。

去掉static关键字能解决性能问题吗?

于 2019-03-15T01:33:47.873 回答