是在c++中内联的const内置类型
Are const built in types inlined in c++?
我查看了C++14引用,但看不到标准会在哪里指出内置类型的常量是由编译器内联的,而不是分配的。即索赔是
const int i = 5;
std::cout<<i;
我使用的所有地方都被替换为5,并且不会分配内存空间。有人能指出标准部分吗?
听起来像是两个概念的组合odr使用和好像规则。
Odr的使用,这将在3.2
一个定义规则一节中涵盖,但我们也可以在4.1
Lvalue到右值转换中找到一些相关的章节,其中说:
当将左值到右值的转换应用于表达式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
--结束示例]
这归结为"好像"规则,该规则规定编译器只能模拟程序的可观察行为,基本上它控制了允许的优化。即使优化可能是允许的,编译器也不必执行优化。如果一个对象产生一个常量表达式,并且不需要地址,那么根据,就好像规则一样,不需要为其分配内存,因为不分配内存的效果是不可观察的。
在大多数情况下,编译器会发出包含常数值的处理器指令,而不会分配读/写内存位置。但这取决于编译器设置。
编译器可以选择将常量放入内存的只读部分。它可以将常量放入可执行文件中。
打印出函数的汇编语言列表以了解真相。
相关文章:
- 内置函数可查看CPP中的成员变量
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 按字母顺序对字符串中的字母进行排序,而无需使用内置的 sort()
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 如何从 c++ 中类中内置的数组继承
- 如何捕获 C++ 内置异常对象
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- 将编译器开关添加到 Eclipse CDT 内置编译器设置生成?
- gcc Atomic在gcc 4.1.1中内置了奇怪的行为
- 是否有用于元素部分移位的 simd 指令/内在/内置指令?
- 何时包含内置类型和运算符的标头?
- 基本类型与内置类型有什么区别C++
- 指内置类型的文字
- GLUT 问题:重新声明 c++ 内置类型'wchar_t'时出错
- const(但不是constexpr)用作内置数组大小
- 在C++标准中哪里说必须初始化 const 内置类型变量的定义
- 内置类型的返回const值
- 是在c++中内联的const内置类型
- 类成员引用变量是否有内置"const-correctness"?
- 在 C++ 中从 const 用户定义类转换为内置类型