首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >直接包含模板比单独实例化慢

直接包含模板比单独实例化慢
EN

Stack Overflow用户
提问于 2019-03-15 07:59:40
回答 2查看 78关注 0票数 0

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

是编译器太慢了,指令缓存变得混乱了,编译器突然内联了本不该内联的长函数,还是其他什么原因?

代码进行了高度优化,在MacOS10.14.3中使用标志:-O3 -ffast-math -march=native -std=gnu++11和GCC 5.5.0进行编译。

EN

回答 2

Stack Overflow用户

发布于 2019-03-15 09:33:48

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

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

票数 0
EN

Stack Overflow用户

发布于 2019-03-16 00:09:30

编译主程序时遗漏了优化标志,可能是CMake错误。当将模板实例化单独编译为库时,使用了优化标志,从而使程序速度更快。我强制在主程序中使用优化标志,并直接包含模板,现在它的运行速度也一样快。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55173725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档