3

考虑以下头文件,它由慢速 constexpr 函数组成,用于初始化全局变量:

constexpr int slow_func() {
    for (int i = 0; i < 100*1024*100; ++i)
            ;
    return 0;
}

constexpr int g_val = slow_func();

调用这个函数大约需要 10 秒

现在,如果这个头文件在多个翻译单元中被#included,编译时间会随着每个翻译单元#includes这个文件的增加而增加

有数百个翻译单元,编译现在需要不合理的时间。

由于这是一个 constexpr 函数,我假设编译器只会计算一次该函数的返回值,并在不同的翻译单元中使用相同的值

有没有办法告诉编译器只评估每个“g_val”的值一次?如果没有,可以做什么?

我目前正在使用 g++-5.4,但我认为标准规定了这种行为(即使我在当前标准中没有找到它)

4

1 回答 1

1

由于#include 的工作方式,您最好在某个地方创建一次变量,然后将其作为全局变量,在所有翻译单元中前向声明(通过#include the forw. dec.)。所以它只需要编译一次,但是任何它被前向声明的地方都可以使用它。

当然,它会成为一个全局变量,所以也有缺点。但是让它成为一个全球性的应该阻止它被重新编译。

于 2017-04-29T00:10:58.177 回答