【发布时间】:2013-09-25 04:31:11
【问题描述】:
-
这可以工作:
const int size = 2; int array[size] = {0}; -
这有编译错误:
int a = 2; const int size = a; int array[size] = {0};
为什么?
【问题讨论】:
-
const并不意味着编译时常量。
这可以工作:
const int size = 2;
int array[size] = {0};
这有编译错误:
int a = 2;
const int size = a;
int array[size] = {0};
为什么?
【问题讨论】:
const 并不意味着编译时常量。
因为 C++ 委员会的人是这样决定的。
技术原因是用于初始化size 的第一个表达式是一个常量表达式,它可以在编译期间计算。这意味着编译器还可以知道数组将有多大,并且可以在编译时完成分配(在这种情况下“保留”可能是更合适的术语)。
在第二种情况下,表达式不是常量表达式(给定 C++ 定义),并且这种恢复是不可能的。
在第二种情况下,值在size 初始化时确实是固定的这一事实完全无关紧要。规则基于“表达式类型”,第二个表达式使用可变变量,因此编译器认为它是非常量的。
允许编译时初始化的第二种形式需要流分析,因为它需要区分
int a = 2;
const int size = a;
和
int a = foo();
const int size = a;
其中涉及size 的表达式确实相同。
【讨论】:
const int size = 2;
int array[size] = {0};
这里,2 是一个字面值,也就是说,你不能改变它,编译器在编译时就知道这个值。
int a = 2;
const int size = a;
int array[size] = {0};
但是,a 是一个变量,这意味着a 的值是可以更改的,并且会在运行时确定所以编译器禁止你。
你可以使用
int a = 2;
int size = a;
int* array = new int[size];
因此,您可以申请一个动态大小的数组。
【讨论】:
即将进行内存管理。
当操作系统因为 C++ 的特性而试图运行你的程序时,操作系统会想知道 stack 区域的确切空间。在第一个示例中,操作系统将知道变量的值不会改变。但是对于第二个例子,从操作系统的角度来看,您的第一个变量“a”可以在
之间更改int a = 2;
这个和这个
const int size = a;
您的变量 a 可以更改。这就是为什么你的编译器不允许你编译你的代码。
为了了解更多关于内存管理的基础知识。我建议你 https://stackoverflow.com/a/24922/2326288此评论。
【讨论】:
因为在第一种情况下,size 在编译时由编译器初始化。在第二种情况下,a可能在运行时被初始化,所以size也将在运行时被初始化并且不再是编译时常量.
【讨论】: