C ++中的数据部分

时间:2010-02-19 16:08:26

标签: c++ memory-management

我有一个问题要澄清我对C ++中计算机内存组织的困惑。

在C ++中,不同的数据放在不同的位置。我的理解是这样的。

1)数据段部分,其中包含全局和静态数据;

2)堆部分,由新

创建的对象

3)堆栈部分,局部变量

4)文本部分,代码本身。

是吗?有什么我错过或做错了吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

Here is a guide可能会有所帮助。

答案 1 :(得分:1)

通常至少有两个数据部分。一个用初始化的全局变量,另一个没有(BSS)。堆栈部分通常不会在二进制文件中发出。

当然,如果你没有指定实现,这些特定于实现的问题是没用的。

答案 2 :(得分:1)

这个问题让我想起了......这就是:http://www.gotw.ca/gotw/009.htm

答案 3 :(得分:1)

我写了一篇名为“C++ Internals :: Memory Layout”的文章,它将为您澄清这一点。

文章摘录:

.text segment

  

这是只读,固定大小的细分。

     

文本段,即a.k.a。代码段,包含编译器和汇编器提供的可执行指令。

.data segment

  

这是一个读写,固定大小的细分。

     

数据段,即a.k.a。初始化数据段,包含已初始化的:

     
      
  • 全局变量(包括全局静态变量)
  •   
  • 静态局部变量。
  •   
     

段的大小取决于源代码中值的大小,这些值可以在运行时更改。

.rdata/.rodata segment

  

这是只读

     

段包含静态未命名数据(如字符串常量)

.bss segment

  

这是一个读写并且与.data段相邻。

     

BSS段,a.k.a。未初始化的数据段,包含静态分配的(全局和静态)变量,仅在程序启动时由零值位表示。 BSS代表符号块启动,这是一种伪操作,存在于为IBM开发的非常旧的汇编程序中。

heap& stack

你是对的。无论如何,如果你想查看一些例子并仔细看看,请参阅上面提到的文章。