C++ 成员变量驻留在哪个内存段中?
我很想知道初始化的成员变量在内存中的位置?i、 例如,css,bss,数据段,堆 如果我的问题很愚蠢,请不要诅咒我:) 比如说C++ 成员变量驻留在哪个内存段中?,c++,variables,initialization,C++,Variables,Initialization,我很想知道初始化的成员变量在内存中的位置?i、 例如,css,bss,数据段,堆 如果我的问题很愚蠢,请不要诅咒我:) 比如说 class A { A(); int m_iVar; } A::A(int i) { m_iVar = i; } A::A() { m_iVar = 99; } main() { A o; // => After compilation, the object o, in which segment does it r
class A
{
A();
int m_iVar;
}
A::A(int i)
{
m_iVar = i;
}
A::A()
{
m_iVar = 99;
}
main()
{
A o; // => After compilation, the object o, in which segment does it reside? and especially where does "m_iVar" reside
A o1(5); // => After compilation here object o1, in which segment does it reside?and especially where does "m_iVar" reside?
A *pA = new A; // After compilation, here the memory pointed by pA, I guess it goes to heap, but the variable "m_iVar" where does it reside
}
它和其他变量一样。标准中没有真正指定它,但是如果创建本地类实例,它通常会驻留在堆栈上,如果
new
It,它会驻留在免费存储中。正如您所期望的,成员变量就在实例内部。静态类变量可能位于其中一个数据段中
“编译后”,非静态实例不会驻留在任何地方,它们是在运行时创建的。类类型的对象与
int
或任何其他类型的对象分配相同。非静态类成员在包含对象内分配
根据标准,本地对象默认具有“自动存储”,这是由操作环境的一部分(通常称为堆栈)实现的。对象是否或如何显式初始化并不重要
使用new
根据标准从“空闲存储”分配内存,其实现也称为堆
静态存储是使用Static
或extern
或在命名空间范围内进行声明的结果,通常由编译器自行决定由数据段(如css、bss或数据)实现
constexpr
对象存在一个异常,如果没有使用对象的地址,它可能只在编译时存在,没有分配任何空间。。编译器没有任何理由为此生成代码。相关:为什么不自己检查一下呢?:)查看编译器生成的汇编指令是一个有趣的练习,然后只要您有调试符号,就可以很容易地看到所有内容都存储在哪里。对于普通的老式C数据,在程序(字符串文本等)、堆栈(局部变量)和堆(用new
分配的数据)中分配,或在静态中(用于静态
或外部
数据)。它们的名称(例如,“bss”)取决于特定的汇编程序和操作系统,不在C标准中。