【问题标题】:How to set variable value at compile time from an expression?如何在编译时从表达式设置变量值?
【发布时间】:2018-12-05 13:44:59
【问题描述】:

我试图在编译时将某些数据类型的 sizeof 值分配给变量。

我尝试了以下代码:

constexpr int foo_implementation () {
        return sizeof(int);
}
#define foo std::integral_constant<int, foo_implementation()>::value
int main() {
    int size;
    for(int i=0;i<10;i++) {
        size = foo;
        std::cout<<size<<std::endl;
    }
    return 0;
}

当我转储预处理器的输出时,它只是将 foo 替换为完整的语句,这是预期的。

我的问题是编译器会将大小硬编码为 4(假设 int 的大小为 4)还是会一次又一次地调用 sizeof 运算符。

如果不是,我怎样才能在编译时在 int 大小的情况下修复 size 的值,以便在运行时节省额外的指令执行?

【问题讨论】:

  • sizeof(int) 实际上从未被“调用”,因此您不妨直接使用它。每个编译器都会直接用生成的二进制文件中的值替换它。

标签: c++ c++11 constexpr


【解决方案1】:

您的代码可以简化并删除#define 以提供:

#include <type_traits>
#include <iostream>

constexpr auto foo = sizeof(int);
int main() {
    int size;
    for(int i=0;i<10;i++) {
        size = foo;
        std::cout<<size<<std::endl;
    }
    return 0;
}

如果您查看disassembly,您可能会看到编译器已将4 硬编码到您的可执行文件中。即使没有constexprsizeof 也会在编译时而不是在运行时进行评估。

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 2011-08-01
    • 2022-08-21
    • 2011-04-20
    • 2013-05-07
    • 2013-10-18
    • 1970-01-01
    • 2019-04-01
    相关资源
    最近更新 更多