【问题标题】:Global array allocation -- stack or heap?全局数组分配——栈还是堆?
【发布时间】:2014-02-25 08:40:04
【问题描述】:

我正在使用 Visual Studio 2008 for Windows 编译以下内容。

当我这样声明一个全局数组时:

//.cpp file

// on a global scale
// (i.e. outside any class definition)
MY_ITEM glob_arr[1024];

在哪里

//.h file
extern MY_ITEM glob_arr[1024];

class MyClass
{
public:
    MyClass()
    {
        //Start using glob_arr
        glob_arr[0].v = 0;
        //...
    }
};

struct MY_ITEM{
    int v;
    WCHAR chrs[64];
};

glob_arr 分配在哪里——从堆栈还是进程堆?

【问题讨论】:

    标签: c++ c visual-studio heap-memory stack-memory


    【解决方案1】:

    C++ 术语是自动、动态和静态存储。全局变量将驻留在静态存储中——具体实现如何处理这取决于它们。

    【讨论】:

    • +1。例如。 this answer 显示了一个实现决策的示例。
    • 好的,你能解释一下——你所说的实现是什么意思?
    • @c00000fd 正式 C/C++ 术语中的“实现”意味着:为特定系统实现编译器。
    • @Lundin:我正在使用 VS 2008 编译器。
    • @c00000fd 确实如此。这里的答案非常笼统。在 VS 上,数组肯定存储在静态内存中。 VS把这段内存称为.bss还是别的什么,我不知道。
    【解决方案2】:

    它不存储在堆栈或堆中。

    glob_arr 具有静态存储持续时间,并且由于您没有显式初始化它,因此它存储在程序的读/写 RAM 段中,通常称为 .bss

    【讨论】:

    • 好的。欣赏它。我需要知道的原因是因为我不想为我的数组用完有限的堆栈大小。但是现在它是在静态存储中分配的,我可能应该从堆中分配它——即使它涉及更多的核心,你不觉得吗?
    • @c00000fd 不。当然可以,但它实际上不会改变任何东西。为什么?
    • @JamesKanze:EXE文件镜像里面不是分配了静态存储数组吗? (从而使生成的可执行文件更大。)
    • @c00000fd 不是.bss 段。可执行文件中的所有内容都是它的大小。加载时,操作系统会分配并初始化为0。 (谁在乎可执行文件的大小?)
    • @KonstantinL 很有趣。如果你能相信dumpbin(我想不出理由不相信),VS 2013 不会使用类似.bss 的东西(无论名称如何):初始化和未初始化的数据都出现在.data 中,看起来有一张未初始化数据的图像。我认为这不是问题;但这很奇怪,因为当我编译时,char x[ 1000000000 ]; 几乎立即编译并加载,但 char x[ 1000000000 ] = { 1 }; 花费了非常明显的时间(秒),无论是编译和链接,还是加载以执行。跨度>
    猜你喜欢
    • 2016-02-04
    • 1970-01-01
    • 2018-06-18
    • 2013-01-10
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    • 2019-10-25
    相关资源
    最近更新 更多