【问题标题】:Binary literals whose value is determined during compile time in C++二进制字面量,其值在 C++ 中的编译期间确定
【发布时间】:2020-01-10 10:55:07
【问题描述】:

如何在不使用预处理器指令的情况下定义在编译时确定其值的常量值二进制文字?

我试过了

#include <iosteam>
using namespace std;


int main()
{
const int x=0b0101;

cout<<x;

return 0;

}

它打印出 5,但是,我不知道它的值是在编译时确定的。我怎么能检查呢?任何帮助表示赞赏!

【问题讨论】:

  • “如果值是在编译时确定的”到底是什么意思? x 的值(可以认为是在编译时间之前确定,由代码作者确定)、打印的字符串等。
  • 您尝试这样做时编译器没有抱怨找不到标头“iosteam”吗?
  • @harold 好吧,我的意思是我需要它是编译时常量
  • @ÖöTiib 不,它编译得很好,顺便说一句,这么多反对意见有什么问题?
  • @cdummie 当然,整数文字是编译时常量

标签: c++ literals


【解决方案1】:

const 在定义时初始化的“变量”通常也是编译时常量。但如果你想确定使用constexpr 而不是const

constexpr int x=0b0101;

【讨论】:

  • 所以基本上,即使使用 const 我也可以说它是编译时间常数,现在,如果我在没有 const 或 constexpr 的情况下声明它呢?
  • @cdummie 如果没有const,它只是一个普通的运行时变量。如果编译器可能优化它作为编译时常量的使用,如果它可以安全地确定它从未被修改并且只在可能的上下文中使用,否则它是不可能的。
【解决方案2】:

一般你可以检查反汇编代码看看会发生什么,也有一个网站,https://godbolt.org/

打字

int main()
{
  const int x=0b0101;
  return 0;
}

那里并禁用优化(-O[x] 开关)会产生如下内容:

main:
    push    rbp
    mov     rbp, rsp
    mov     DWORD PTR [rbp-4], 5
    mov     eax, 0
    pop     rbp
    ret

5 在代码中显示为立即值,显然是由编译器提供的。
正如您在其他地方问的那样:没有const 也是一样的,CPU 不在乎某个具有地址的实体是否是常量。例如const_cast&lt;&gt; 不是实际操作,它只是编译器的标记。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2022-01-25
    • 2010-10-16
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2010-10-06
    • 2011-08-12
    相关资源
    最近更新 更多