类的内存位置(参考C+;+;对象模型手册中的内容) 我现在正在阅读C++对象模型里面。在第9页,它有一个图表,显示了类的内容在内存中的布局。它指出,实际驻留在类内存中的对象的唯一部分是非静态数据成员

类的内存位置(参考C+;+;对象模型手册中的内容) 我现在正在阅读C++对象模型里面。在第9页,它有一个图表,显示了类的内容在内存中的布局。它指出,实际驻留在类内存中的对象的唯一部分是非静态数据成员,c++,stack,heap,C++,Stack,Heap,以下是SO关于程序内存内容的帖子: 在第二个答案中,它详细说明了程序的内存布局——显示堆栈和堆 静态数据成员/任何类的位置是否起作用(基本上是类中未存储在对象中的部分-参见第9页)根据对象是在堆栈上还是在堆上进行更改?静态数据成员驻留在全局变量和普通静态变量将驻留的内存区域中。“类内存”可能位于堆栈或堆上,具体取决于类实例的创建方式 静态数据成员与全局变量没有太大区别。但是,它的作用域是由类名确定的,可以通过public、private和protected控制其名称访问公共允许所有人访问pri

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

在第二个答案中,它详细说明了程序的内存布局——显示堆栈和堆


静态数据成员/任何类的位置是否起作用(基本上是类中未存储在对象中的部分-参见第9页)根据对象是在堆栈上还是在堆上进行更改?

静态数据成员驻留在全局变量和普通静态变量将驻留的内存区域中。“类内存”可能位于堆栈或堆上,具体取决于类实例的创建方式

静态数据成员与全局变量没有太大区别。但是,它的作用域是由类名确定的,可以通过
public
private
protected
控制其名称访问<代码>公共允许所有人访问
private
将仅限制对类成员的访问,
protected
类似于
private
,但扩展了对从具有静态数据成员的类继承的类的访问

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


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

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

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


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

为了确认,本书第9页指出,非静态函数也与类对象分开存储?我能理解为什么静态的东西是(因为你只有一个副本,所以是静态的),但我很惊讶地看到非静态函数没有包含在对象中。@user997112:类方法与静态方法类似,只是
this
参数是隐式的,而静态方法没有
this
参数(因为该方法应该适用于任何实例)。谢谢-我想我刚才在对另一张海报的评论中回答了我自己的问题。只有非静态数据成员必须针对每个对象,因为它们构成“状态”对象的属性,并且每个对象可以不同。相反,类函数对于该类的任何实例都是相同的?@user997112:是的,除了
虚拟的
,正如我在编辑中所述。Regardso基本上是一样的,因为非静态数据成员对“状态”有贡献对于单个对象-它们是唯一包含在对象地址空间中的对象?它们必须是唯一的,因为每个对象可以有不同的数据成员值。相比之下,非静态函数仍然是相同的函数,无论哪个非静态对象访问它?是的,非静态数据特定于每个对象,因此re可能有多个副本。静态数据是共享的,因此只有一个副本。成员函数与“普通”函数的不同之处在于,它有一个
this
指针,指示调用的对象。静态成员函数没有
this
,因此它们与自由函数非常相似(除非它们可以是私有的,以限制访问)。