c++ - C++ 编译器如何处理 const 数组

标签 c++ arrays constants

这些常量数组是在内存中分配空间还是编译器足够聪明并将其分解为文字?

我只是举个例子:

const int array[] = {
    1, 2, 3, 4, 5
};

好吧,我只想知道别的。

最佳答案

简短的回答是:视情况而定。

长答案是:

如果你编译这个:

const int array[] = {
   1, 2, 3, 4, 5
};

int
main()
{
   return array[0];
}

你最终在 x86/Linux 上得到这个(简化):

       .globl  main
main:
       movl    $1, %eax
       ret

所以是的,它不会存储在任何地方,而是被视为在编译时评估的常量。

但是,如果你这样使用它:

const int array[] = {
   1, 2, 3, 4, 5
};

int
main()
{
   return (long)array;
}

它变成了:

        .globl  main
main:
        leal    _ZL5array(%rip), %eax
        ret
        .section        .rodata
        .align 16
_ZL5array:
        .long   1
        .long   2
        .long   3
        .long   4
        .long   5

它在 rodata 部分结束,因为您告诉编译器您实际上需要它作为数组。

关于c++ - C++ 编译器如何处理 const 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16811137/

相关文章:

C++ 基本 while 循环,通过按键退出

lambda 表达式中的 C++ 模板仿函数

我可以静态分配这个字符串吗?如何?

c - 如何从 C 中的结构复制字符?

c++ - const 引用模板参数中的函数?

c++ - 字符串缓冲区如何导致恶意代码运行?

c++ - error C2783 无法推断模板参数

javascript对象解析并创建新的对象数组

c++ - std::set 迭代器自动 const

c++ - 为什么不能将一个类的常量实例与同一类的非常量实例进行比较?