【发布时间】:2019-03-25 15:21:01
【问题描述】:
我希望在编译时计算 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);
【问题讨论】:
-
尽管呈现的代码不是真实代码,"...以下代码在编译时运行..." - 代码没有' t 在编译时运行;它是在编译时构建的。您的帖子提出了一个问题,您实际上要解决什么问题?因为,如果有的话,这具有XY problem 的所有香气。
-
这是我帖子的第一句话,“我有 3 个全局变量,我希望在编译时计算”如果可能的话,我希望这 3 个变量在程序启动之前已经计算好了。
-
@TJ8 您需要有一个
constexpr函数来为这些变量中的每一个返回适当的值。您还需要将这些变量标记为constexpr,以便您可以在编译时计算中重复使用这些变量。最后但并非最不重要的一点是,您需要提供pow()的constexpr版本(这可能通过递归模板实现)。 -
我对我的原始帖子进行了编辑,其中包含您的建议并且似乎有效。这是最优化的方式还是可以缩短?
标签: c++ function global constexpr compile-time