今天在阅读C++ Primer "constexrp和常量表达式"章节时发现有这么一句话:
"常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式
"
又有:
"C++11标准新规定, 允许将变量声明为constexpr来由编译器验证变量的值是否是一个常量表达式
"
在验证constexpr类型说明符功能时我编写了如下代码:
#include <iostream>
int a = 99;
constexpr int *pa = &a;
int main()
{
std::cout<<pa<<std::endl;
return 0;
}
这段代码编译通过了并输出了结果;
我的疑问是, 按我一直以来的理解, 程序中的数据是在运行时才会被加载到内存中的,这里a应该是放在了全局/静态存储区;
而这里constexpr int *pa = &a;
通过了编译,说明&a
是一个可以在编译过程中获得结果的常量表达式, 所以说这里C++编译器在编译过程中就得到了&a
的计算结果即a的地址?
没用过C++ 但是编译器在编译过程就会把变量的地址确定下来
而局部变量不一样 它是放在栈中的 地址在运行中才会确定下来
举个例子:
假如我编译一门语言 在内存中分配了一块内存供变量使用 假设地址从0开始算 遇到一个新变量 地址标为0 并记录在哈希表中 再遇到一个新变量地址标为1 依此类推 并且用符号表记录下来 如果遇到的一个变量已经在哈希表中 那代表不是新变量