【问题标题】:Array initialization use const variable in C++数组初始化在 C++ 中使用 const 变量
【发布时间】:2013-09-25 04:31:11
【问题描述】:
  1. 这可以工作:

    const int size = 2;
    int array[size] = {0}; 
    
  2. 这有编译错误:

    int a = 2;
    const int size = a;
    int array[size] = {0};
    

为什么?

【问题讨论】:

  • const 并不意味着编译时常量。

标签: c++ arrays constants


【解决方案1】:

因为 C++ 委员会的人是这样决定的。

技术原因是用于初始化size 的第一个表达式是一个常量表达式,它可以在编译期间计算。这意味着编译器还可以知道数组将有多大,并且可以在编译时完成分配(在这种情况下“保留”可能是更合适的术语)。

在第二种情况下,表达式不是常量表达式(给定 C++ 定义),并且这种恢复是不可能的。

在第二种情况下,值在size 初始化时确实是固定的这一事实完全无关紧要。规则基于“表达式类型”,第二个表达式使用可变变量,因此编译器认为它是非常量的。

允许编译时初始化的第二种形式需要流分析,因为它需要区分

int a = 2;
const int size = a;

int a = foo();
const int size = a;

其中涉及size 的表达式确实相同。

【讨论】:

  • 那么如果这个大小不是这样初始化的,就没有办法初始化一个已知大小的数组?
  • @Zap 只有在静态时间知道大小值的情况下才能在堆栈内存中初始化数组,否则您可以使用堆内存来完成。
【解决方案2】:
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];

因此,您可以申请一个动态大小的数组。

【讨论】:

    【解决方案3】:

    即将进行内存管理。

    当操作系统因为 C++ 的特性而试图运行你的程序时,操作系统会想知道 stack 区域的确切空间。在第一个示例中,操作系统将知道变量的值不会改变。但是对于第二个例子,从操作系统的角度来看,您的第一个变量“a”可以在

    之间更改
    int a = 2;
    

    这个和这个

    const int size = a;
    

    您的变量 a 可以更改。这就是为什么你的编译器不允许你编译你的代码。

    为了了解更多关于内存管理的基础知识。我建议你 https://stackoverflow.com/a/24922/2326288此评论。

    【讨论】:

      【解决方案4】:

      因为在第一种情况下,size 在编译时由编译器初始化。在第二种情况下,a可能运行时被初始化,所以size也将在运行时被初始化并且不再是编译时常量.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2017-05-01
        • 2018-03-01
        • 2023-02-11
        相关资源
        最近更新 更多