如何在编译时根据表达式设置变量值?

时间:2018-12-05 13:45:00

标签: c++ c++11 constexpr

我正在尝试在编译时将某些数据类型的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替换为complete语句,这是预期的。

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

如果没有,我如何在编译时将in的大小固定为编译时的size值,以节省运行时的额外指令执行?

1 个答案:

答案 0 :(得分:0)

您的代码可以简化,#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也会在编译时而不是在运行时求值。