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

可以说我有以下程序。 这部分内存是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);
}

在静态存储中,使用标准说话。 关于静态存储应该如何实现的问题并没有多少说明,除了应该在程序的整个时间内持续存在,并且如果没有给出非零初始化器,它应该被隐式地初始化为零。


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

你的编译器的binutils(比如nm或者objdump )可以让你查看(依赖于实现)的细节。


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


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

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

但底线是:你不应该在意,因为C没有指定这个,并且有些平台不提供细分或堆,...

链接地址: http://www.djcxy.com/p/82507.html

上一篇: Where are global (statically compiled) variables located?

下一篇: Where do command line arguments reside?