是在c++中内联的const内置类型

Are const built in types inlined in c++?

本文关键字:const 内置 置类型 c++ 是在      更新时间:2023-10-16

我查看了C++14引用,但看不到标准会在哪里指出内置类型的常量是由编译器内联的,而不是分配的。即索赔是

const int i = 5;
std::cout<<i;

我使用的所有地方都被替换为5,并且不会分配内存空间。有人能指出标准部分吗?

听起来像是两个概念的组合odr使用好像规则

Odr的使用,这将在3.2一个定义规则一节中涵盖,但我们也可以在4.1Lvalue到右值转换中找到一些相关的章节,其中说:

当将左值到右值的转换应用于表达式e时,以及任一

  • e未进行潜在评估,或
  • e的求值导致对e的潜在结果集的成员ex的求值,并且ex命名了一个不是ex(3.2)使用的odr

不访问引用对象中包含的值

并且具有以下涉及的示例,该示例似乎显示了在其寿命之外使用的通过引用捕获的局部变量,但事实并非如此,因为它不是odr使用的,因此实际上不需要分配对象,因此可以优化掉。

[示例:

struct S { int n; };
auto f() {
    S x { 1 };
    constexpr S y { 2 };
    return [&](bool b) { return (b ? y : x).n; };
}    
auto g = f();
int m = g(false); // undefined behavior due to access of x.n outside its lifetime
int n = g(true); // OK, does not access y.n

--结束示例]

这归结为"好像"规则,该规则规定编译器只能模拟程序的可观察行为,基本上它控制了允许的优化。即使优化可能是允许的,编译器也不必执行优化。如果一个对象产生一个常量表达式,并且不需要地址,那么根据,就好像规则一样,不需要为其分配内存,因为不分配内存的效果是不可观察的。

在大多数情况下,编译器会发出包含常数值的处理器指令,而不会分配读/写内存位置。但这取决于编译器设置。

编译器可以选择将常量放入内存的只读部分。它可以将常量放入可执行文件中。

打印出函数的汇编语言列表以了解真相。