Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 全局数组分配——堆栈还是堆?_C++_C_Visual Studio_Stack_Heap - Fatal编程技术网

C++ 全局数组分配——堆栈还是堆?

C++ 全局数组分配——堆栈还是堆?,c++,c,visual-studio,stack,heap,C++,C,Visual Studio,Stack,Heap,我正在使用Visual Studio 2008 for Windows编译以下内容 当我声明一个全局数组时: //.cpp file // on a global scale // (i.e. outside any class definition) MY_ITEM glob_arr[1024]; 在哪里 及 >代码> GoopyARR < /C>分配-从堆栈或进程堆中, < P> C++术语是自动、动态和静态存储。全局数据将驻留在静态存储中—具体实现如何处理这一问题取决于它们。它既不存

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

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

//.cpp file

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


<> >代码> GoopyARR < /C>分配-从堆栈或进程堆中,

< P> C++术语是自动、动态和静态存储。全局数据将驻留在静态存储中—具体实现如何处理这一问题取决于它们。

它既不存储在堆栈上,也不存储在堆上


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

+1。例如,显示了一个实现决策的示例。好的,你能解释一下——你所说的实现是什么意思吗?@c00000fd“实现”在正式的C/C++术语中的意思是:为特定系统实现编译器。@Lundin:我使用的是VS 2008编译器。@c00000fd确实如此。这个答案非常笼统。在VS上,数组肯定存储在静态内存中。我不知道VS是否将此内存称为
.bss
或其他内容。谢谢。我需要知道的原因是,我不想为我的数组使用有限的堆栈大小。但是现在它是在静态存储中分配的,我可能应该从堆中分配它——即使它涉及更多的核心,你不觉得吗?@c0000fd不。当然可以,但它实际上不会改变任何东西。为什么?@JamesKanze:EXE文件映像中没有分配静态存储阵列吗?(从而使生成的可执行文件变大。)@c0000fd不是
.bss
段。可执行文件中的所有内容都是它的大小。加载时,操作系统将分配它并将其初始化为
0
。(谁在乎可执行文件的大小?@KonstantinL很有趣。如果您相信
dumpbin
(我想不出不使用的理由),VS 2013不会使用类似
.bss
(无论名称如何):初始化数据和未初始化数据都显示在
.data
中,并且看起来有一个未初始化数据的图像。我不认为这是个问题;但这很奇怪,因为当我编译时,
charx[100000000]几乎立即编译和加载,但是
charx[100000000]={1}花费了相当长的时间(秒),无论是编译和链接,还是为了执行而加载。
//.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];
};