【问题标题】:Memory layout of a c programc程序的内存布局
【发布时间】:2014-06-26 05:52:48
【问题描述】:

我正在阅读这篇文章http://www.geeksforgeeks.org/memory-layout-of-c-program/, 它说“存储在bss中的未初始化变量”,“存储在数据段中的初始化变量”

我的问题是为什么我们需要为变量设置 2 个单独的段? 1. BSS 2. 数据段?

为什么不把所有东西都放在一个段中?

【问题讨论】:

    标签: c


    【解决方案1】:

    BSS 不占用程序映像中的空间。它只是指示 BSS 部分有多大,运行时会将内存设置为零。

    数据部分填充了变量的初始值,因此它占用了程序映像文件中的空间。

    【讨论】:

      【解决方案2】:

      据我所知,未初始化的变量(在 .bss 中)在进入程序时会(或应该)清零。初始化变量 (.data) 获得特定值。

      这意味着在程序的可执行文件中(存储在磁盘上),.data 段必须包含每个字节的字节(因为每个变量都有可能不同的值)。但是,.bss 不能按字节保存。加载可执行文件时必须只知道要在内存中保留的大小。程序知道.bss中每个变量的偏移量

      要将所有未初始化的变量清零,一些汇编指令就可以了(例如,对于 x86:rep stosw 带有一些寄存器设置)。

      结论:.data 的加载和初始化时间比大型 .bss 段要糟糕得多,因为 .data 必须从磁盘加载,而 .bss 只能在运行时保留,只需要很少的 cpu 指令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-11
        • 1970-01-01
        • 1970-01-01
        • 2013-05-24
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        相关资源
        最近更新 更多