我有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);
答案 0 :(得分:-1)
您想要使用constexpr
。但这并不总是可行。
通常std::pow
不是constexpr
(https://en.cppreference.com/w/cpp/numeric/math/pow)。
如果您确实要进行编译时计算,则需要自己将这些缺少的函数实现为constexpr
。实际上,标准库通常不是constexpr
,因此它仍会在运行时进行处理。请查看https://www.youtube.com/watch?v=CRDNPwXDVp0&frags=pl%2Cwn,以获取有关将来存储的更多信息。