我目前正在阅读C ++对象模型内部。在第9页上,它有一个图表显示了如何在内存中布置类的内容。它声明实际驻留在类内存中的对象的唯一部分是非静态数据成员。
以下是关于程序内存内容的SO帖子:
Global memory management in C++ in stack or heap?
在第二个答案中,它详细介绍了程序的内存布局 - 显示了堆栈和堆。
静态数据成员/任何类函数的位置(基本上是未存储在对象中的类的部分 - 引用第9页)是否会根据对象是在堆栈还是堆上而改变?
答案 0 :(得分:4)
静态数据成员驻留在全局变量和普通静态变量所在的内存区域中。它是“类内存”,可以在堆栈或堆上,具体取决于类的实例是如何创建的。
静态数据成员与全局变量没有太大区别。但是,它的范围是类名,并且可以通过public
,private
和protected
控制其按名称访问。 public
可让所有人访问。 private
将仅限制对类成员的访问,protected
与private
类似,但扩展了对具有静态数据成员的类继承的类的访问权限。
相比之下,每个人都可以按名称访问全局变量。可以通过同一源文件中的代码按名称访问普通静态变量。
普通类方法实际上只是一个常规函数(模访问控件),但它有一个隐式this
参数。它们不占用课堂上的任何空间。但是,virtual
类方法会占用类中的一些内存,因为它必须解析为派生类的方法实现。但是,在您的教科书中,多态性可能尚未涵盖。
答案 1 :(得分:2)
不,分配变量的地方不会影响静态数据或代码的存储。它们通常存储在单独的内存区域中,既不是堆栈也不是堆栈。
函数和静态数据成员的特殊之处在于整个程序中只有一个副本。
类或其他类型的变量通常在程序运行期间多次创建和销毁。