C ++具有在编译时计算全局变量的功能

时间:2018-10-21 10:21:45

标签: c++ function global constexpr compile-time

我有3个全局变量,希望在编译时进行计算,而无需先获取结果并手动分配全局变量。

我目前的设置方式是有一个名为Init()的函数,该函数仅计算3个变量,并且此Init()函数在Main顶部附近被调用。 我尝试做的是在函数的前面添加constexpr,但是在调用Init()之前将值打印为0。

在编译时运行以下代码中的Init()函数并在程序开始时已经计算出3个全局变量的最佳方法是什么(如果有的话)。

示例代码:

static const int length = 8;
static const int seed = 40;

long long key1, key2, key3; // I want these to be calculated at compile-time instead of run-time if possible

void Init() {
    key1 = pow(seed, length);
    key2 = key1 * seed;
    key3  = key2 * seed;
}

...
void main(int argc,char * argv[]) {
    Init();
    ...
}

编辑:

我做了如下的事情,并且似乎可以正常工作,因为我可以将值打印在main的顶部: 我有什么办法可以改善或缩短代码的工作量?

constexpr long long calcKey1() {
    long long key1 = 1;
    for (int i = 0; i < length - 2; i++)
        key1 *= seed;

    return key1;
}

constexpr long long calcKey2(const long long key1) {
    return key1* seed;
}

constexpr long long calcKey3(const long long key2) {
    return key2 * seed;
}

constexpr long long key1 = calcKey1();
constexpr long long key2 = calcKey2(key1);
constexpr long long key3 = calcKey3(key2);

1 个答案:

答案 0 :(得分:-1)

您想要使用constexpr。但这并不总是可行。

通常std::pow不是constexprhttps://en.cppreference.com/w/cpp/numeric/math/pow)。

如果您确实要进行编译时计算,则需要自己将这些缺少的函数实现为constexpr。实际上,标准库通常不是constexpr,因此它仍会在运行时进行处理。请查看https://www.youtube.com/watch?v=CRDNPwXDVp0&frags=pl%2Cwn,以获取有关将来存储的更多信息。