C++ 全局数组分配——堆栈还是堆?
我正在使用Visual Studio 2008 for Windows编译以下内容 当我声明一个全局数组时: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++术语是自动、动态和静态存储。全局数据将驻留在静态存储中—具体实现如何处理这一问题取决于它们。它既不存
//.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];
};