【问题标题】:C++ Have function on compile time calculate global variablesC ++在编译时具有计算全局变量的功能
【发布时间】: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


【解决方案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,了解有关未来存储内容的更多信息。

【讨论】:

  • 卡蒙伙计们。给出你投反对票的理由......这样人们就可以理解发生了什么,比如我。 -.-
  • @Yucel_K 这不是一个自包含的有用答案。有趣的信息都隐藏在链接中(随着时间的推移可能很容易失效)。这不是我们在这里寻找的。因此,我 DV 了那个答案并标记为 非常低质量
  • 转发到 cppreference 和来自 cppcon 的视频表明编译时表达式会发生什么是低质量的?那你的答案是什么?至少我的答案来源正确。
  • @πάνταῥεῖ 啊..我认为答案是错误的,并且想知道为什么它是错误的。感谢您的澄清。
  • 您还可以在 godbolt.org 上查看它确实生成了编译时间常数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多