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

Posted

技术标签:

【中文标题】如何在编译时从表达式设置变量值?【英文标题】: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) 实际上从未被“调用”,因此您不妨直接使用它。每个编译器都会直接用生成的二进制文件中的值替换它。 【参考方案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 也会在编译时而不是在运行时进行评估。

【讨论】:

以上是关于如何在编译时从表达式设置变量值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Zeppelin 上从 JavaScript 设置角度变量值

如何知道为 union 设置了哪个变量值?

如何在emacs组织模式中设置变量值?

如何在编译时从 string_view 中删除子字符串?

如何在 gitlab-ci.yml 文件中通过 ssh 设置变量值

平台内置业务表变量值设置