什么时候将内存分配给C++; 我是一个C++新手,面临一个问题。

什么时候将内存分配给C++; 我是一个C++新手,面临一个问题。,c++,memory,static,initialization,C++,Memory,Static,Initialization,我在一本书中读到,一旦该类的对象被创建,内存就被分配给静态变量。现在,如果我把这个静态变量设为全局变量呢?在那种情况下,它什么时候初始化 另外,我也读过一些文章,静态变量是在堆上分配的,它们不依赖于对象的构造……这是真的吗?如果是,请向我解释内存初始化步骤,我需要帮助 非常感谢 静态变量根本不存储在堆中 未初始化的静态变量存储在BSS段中 初始化的静态变量存储在数据段中 你可以阅读这篇文章,它以一种很好的方式解释了所有这些: 在programstart上(在main之前),将为静态全局变量分配内

我在一本书中读到,一旦该类的对象被创建,内存就被分配给静态变量。现在,如果我把这个静态变量设为全局变量呢?在那种情况下,它什么时候初始化

另外,我也读过一些文章,静态变量是在堆上分配的,它们不依赖于对象的构造……这是真的吗?如果是,请向我解释内存初始化步骤,我需要帮助


非常感谢

静态变量根本不存储在堆中

未初始化的静态变量存储在BSS段中

初始化的静态变量存储在数据段中

你可以阅读这篇文章,它以一种很好的方式解释了所有这些:

在programstart上(在main之前),将为静态全局变量分配内存


我对第二个问题一无所知。

第一:停止在C和C++中考虑全局变量,否则你会使你的混乱状态持续下去。这个问题比Python或Pascal中的问题更复杂,因此不能只使用一个单词来表示概念

第二,没有“堆”或“栈”——这些是操作系统和CPU细节,与抽象C++语言规范无关。 现在,变量有1)作用域、2)链接和3)存储类。static关键字用于影响所有三个方面,具体取决于使用它的位置

范围:声明变量的位置。如果在函数内,则是函数作用域;如果在函数外,则是文件作用域(您可能称之为“全局变量”)

链接:是否可以从其他编译单元访问变量(当程序由多个源文件组成时相关)

存储类

静态变量在程序启动时以实现定义的方式分配,并且它们一直存在到程序结束。它们不能被“释放”或“重新分配”。(如其他人所述,典型的实现是BSS和数据段)

自动变量仅存在于函数作用域中,它们在函数入口(通常在CPU堆栈上)分配(可能初始化)并在函数出口处解除分配

动态存储类可能就是您所说的“堆”。这些变量的存储是通过malloc/free或new/delete直接操作的。静态变量存储的管理方式与动态存储截然不同,这两种存储从根本上是不兼容的

例如:

===
// ALL file-scope variables have static storage class
int global1;        // file-scope, external linkage
static int global2; // file-scope, internal linkage

void f()
{
  static int x;     // static storage class, function-scope
  int y;            // automatic storage class, function-scope

  free(&x);         // ILLEGAL, WILL CRASH!
  free(&y);         // DITTO!
  free(&global1);   // DITTO!
}
===
现在,具有静态存储类(global1、global2和x)的所有变量都在程序启动之前分配和初始化。如果未指定初始值,则默认情况下会按未指定的顺序初始化它们。(对于基元类型,这只意味着用零填充)


静态变量仅在程序退出时解除分配。这意味着,函数f中的“x”将只初始化一次(在程序启动时),并且它将在函数调用之间保留其值(与y相反,y将在每个函数条目上分配,并在每个函数出口处解除分配,因此其值也将被销毁)。请注意,在函数中使用静态变量与多线程和可重入性非常不兼容,除非您非常清楚自己在做什么。

注意:这并不是完全不确定的。同一编译单元中的所有文件作用域变量都按照声明/定义的顺序初始化。只是没有指定编译单元之间的顺序(或者即使在初始化过程中不同编译单元中的文件范围变量相互交织),在上面的程序中,“global1”首先用0初始化global2'第二次初始化为0'第一次调用函数f()时,x'被初始化。我想在这里补充一个疑问。静态函数和普通函数的初始化有什么区别?我已经读到,即使是普通函数,无论对象的数量是多少,也只有一个副本-这与静态函数非常相似…“静态”函数只影响链接:函数获得内部链接,并且只能从定义它的同一文件访问。这使得在多个文件中定义名为“f”的静态函数成为可能。如果尝试使用非静态函数执行此操作,链接器将抱怨符号“f”的多个定义。是否存储特定于全局变量的标准?如果是这样,我想从标准中得到一个参考。