类的内存位置(指C ++对象模型书内部)

时间:2012-07-01 16:47:09

标签: c++ stack heap

我目前正在阅读C ++对象模型内部。在第9页上,它有一个图表显示了如何在内存中布置类的内容。它声明实际驻留在类内存中的对象的唯一部分是非静态数据成员。

以下是关于程序内存内容的SO帖子:

Global memory management in C++ in stack or heap?

在第二个答案中,它详细介绍了程序的内存布局 - 显示了堆栈和堆。

静态数据成员/任何类函数的位置(基本上是未存储在对象中的类的部分 - 引用第9页)是否会根据对象是在堆栈还是堆上而改变?

2 个答案:

答案 0 :(得分:4)

静态数据成员驻留在全局变量和普通静态变量所在的内存区域中。它是“类内存”,可以在堆栈或堆上,具体取决于类的实例是如何创建的。

静态数据成员与全局变量没有太大区别。但是,它的范围是类名,并且可以通过publicprivateprotected控制其按名称访问。 public可让所有人访问。 private将仅限制对类成员的访问,protectedprivate类似,但扩展了对具有静态数据成员的类继承的类的访问权限。

相比之下,每个人都可以按名称访问全局变量。可以通过同一源文件中的代码按名称访问普通静态变量。

普通类方法实际上只是一个常规函数(模访问控件),但它有一个隐式this参数。它们不占用课堂上的任何空间。但是,virtual类方法会占用类中的一些内存,因为它必须解析为派生类的方法实现。但是,在您的教科书中,多态性可能尚未涵盖。

答案 1 :(得分:2)

不,分配变量的地方不会影响静态数据或代码的存储。它们通常存储在单独的内存区域中,既不是堆栈也不是堆栈。

函数和静态数据成员的特殊之处在于整个程序中只有一个副本。

类或其他类型的变量通常在程序运行期间多次创建和销毁。