我查看了C ++ 14参考,并且无法看到标准将说明const内置类型由编译器内联而未分配。即索赔是
const int i = 5;
std::cout<<i;
我使用的所有地方都被替换为5,并且不会分配任何内存空间。有人可以指向标准部分吗?
答案 0 :(得分:2)
听起来像两个概念 odr use 和 as-if规则的组合。
Odr-use,将在3.2
一个定义规则部分中介绍,但我们也可以在4.1
Lvalue-to中找到一些相关部分-rvalue conversion ,其中包含:
当将左值到右值转换应用于表达式e时,和 任
- e无法评估,或
- e的评估结果是对e的潜在结果集合的成员ex的评估,并且ex名称变量x不是 odr-used by ex(3.2),
不会访问引用对象中包含的值。
并且具有以下涉及的示例,其似乎示出了通过引用捕获的局部变量在其生命周期之外使用但实际上并非如此,因为它不是使用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
-end example]
这归结为as-if rule,它表示编译器只模拟程序的可观察行为,基本上它控制着哪些优化是允许的。即使可以允许优化,编译器也不必执行优化。如果一个对象产生一个常量表达式并且不需要该地址,则 as-if规则不需要为它分配内存,因为不能分配内存的效果是不可观察的。
答案 1 :(得分:1)
在大多数情况下,编译器将发出包含常量值的处理器指令,而不分配读/写内存位置。但这取决于编译器设置。
编译器可以选择将常量放入内存的只读部分。它可以将常量放入可执行文件中。
打印出函数的汇编语言列表以查看真相。