考虑以下头文件,它包含缓慢的constexpr函数,用于初始化全局变量:
constexpr int slow_func() {
for (int i = 0; i < 100*1024*100; ++i)
;
return 0;
}
constexpr int g_val = slow_func();
调用此函数需要~10s
现在,如果此标题在多个翻译单元中获得#included,每个翻译单元的编译时间都会增加#includes此文件
有数百个翻译单元,编译现在花费了不合理的时间。
由于这是一个constexpr函数,我假设编译器只评估此函数的返回值,并在不同的翻译单元中使用相同的值
有没有办法告诉编译器评估每个&#39; g_val&#39;的价值?只有一次? 如果没有,可以做些什么?
我目前正在使用g ++ - 5.4,但我认为标准要求这种行为(即使我没有在当前标准中找到它)
答案 0 :(得分:1)
由于#include的工作原理,你最好先将变量放在某处,然后将它变成一个全局变量,在所有翻译单元中向前声明(通过#including forw.dec。)。这样它只需要编译一次,但是前面声明的任何地方都可以使用它。
当然,它将是一个全局变量,因此也存在缺点。但要使它成为一个全球性的应该可以阻止它被重新编译。