全局(静态编译)变量位于何处?

时间:2017-10-09 22:35:02

标签: c++ c

假设我有以下计划。内存的哪一部分是a分配的? cc++的行为也一样吗?

// a is allocated in the ?
int a[3] = {1, 2, 3};

int main()
{
    // x is allocated in the stack
    int x[3] = {4, 5, 6}

    // y is allocated in the heap
    int* y = malloc(sizeof(int)*3);
}

3 个答案:

答案 0 :(得分:2)

分配它们取决于您的机器体系结构以及您的编译器和链接器实现(两者都没有指定)。 C ++语言标准在这个问题上无话可说。

答案 1 :(得分:1)

静态存储中,使用标准说话。它并没有真正说明应该如何实现静态存储,除了它应该在程序的整个时间内持续下去,并且如果没有非零,它应该被隐式零初始化给出了初始化程序。

实际上在ELF二进制文件中,这些变量都被连接成各个部分,这些部分在加载时被映射到段上,这些段基本上是具有某些存储器保护位开启或关闭的存储器块。如果全局变量是可写的并且使用非零值初始化,则它将进入指定为.data的ELF部分。 zero - 初始化变量将进入.bss(不是二进制图像的一部分以节省空间),const个静态变量将进入.rodata,这将被映射只读,便于写保护。

您的编译器的binutils(例如nmobjdump)可以让您查看(依赖于实现的)详细信息。

答案 2 :(得分:0)

这是一个实现细节,堆栈也是如此。语言C没有这样的概念。如果您的实现使用,它可能还使用操作系统提供的二进制格式的段。在这种情况下,静态变量放在databss段中,因此它们既可以是程序本身(数据)的一部分,也可以在加载程序时由OS分配(bss)。

一种常见的方法是将默认初始化变量放在bss中,因为这样,它们不会增加可执行文件的大小。对于常量数据,通常有rodata段可用,许多C编译器将字符串文字放在那里。

但最重要的是:您不应该关心,因为C没有指定这个,并且有些平台不提供段或堆,...

相关问题