当前位置:首页 > 内存 > 正文

类对象的内存结构

  • 内存
  • 2024-08-28 17:18:08
  • 4531

一、谁能帮我解释下关于类对象大小的问题呢?这就是它的意思。
1.如果你熟悉C语言,C语言有一个库函数,叫做sizeof()。对于32位编程,sizeof(char)为2,sizeof(int)为4。
2.那么,如果我们定义一个结构体(C语言中的struct)
structtest
{
inti;
intj;
chark;
}
testt;
这次使用sizeof(t)时,变成10,因为sizeof(i)+sizeof(j)+sizeof(k)=4+4+2=10
3.然后面向对象的方法引入了类的概念。如果我定义一个类(在C++中,结构体和类之间的唯一区别是默认的公共类和私有类)。
Classtest()
{
inti;
intj;
chark;

testt;
所以,当我们现在使用sizeof(t)时,结果将大于10。具体值取决于不同的环境。为什么?由于C++引入了面向对象的概念,在面向过程的语言(C)中,结构体就是结构体,总字节大小(占内存空间)等于所有包含的数据元素的字节大小之和(见2)。)。但在面向对象(C++)中,类还包含一些其他信息,例如各种构造函数、析构函数和成员函数。C++会将这些函数的入口地址存储在一个表中,而这个表需要一个指针。。指针需要一定的字节空间。因此,类对象(t)的字节大小(sizeof(t))等于所有数据元素(i,j,k)的字节空间加上一些用于存储其他信息的“隐式”字节空间,大于数据元素的字节空间之和。
有关更多详细信息,请参阅ThinkinginC++。


二、类对象里面只有成员变量占用空间,成员函数不占用空间。这不是基于记忆,而是基于理解。你的问题可以这样理解:
什么是变量?它是内存中的一个空间,这个空间中可以放置任何数字或字符(这与变量的定义有关,如字符类型、整数类型等)。
有什么功能?它是一段实现特定功能的代码。该代码直接运行(CPU=运算单元+控制器)。如果这段代码使用了变量,显然需要分配空间(这就是变量分配空间);如果这段代码不使用变量,那么实际上不需要分配空间。
因此,从广义上讲,成员函数不占用空间,而只有变量占用空间。
----------------------------------------------------
来自从另一个角度来看,如果成员函数占用空间,那么所有代码​​都占用空间这显然是一个伪命题(要理解为什么它是一个伪命题,请参阅操作系统架构以获取详细信息)。


三、类和结构的区别

1存储类型:结构体是一种值类型,存储在堆栈中。类是一种引用类型,存储在堆上,堆上存储的是真实数据,堆上存储的是存储地址,如果一个引用的值改变,那么同一个引用的值也会改变。

2.继承:一个类可以继承另一个类或接口,也可以被继承,类的很多特性都是通过继承来展现的,声明时必须密封展示。结构没有继承:它不能从另一个结构或类继承,也不能被继承。因此,结构不能有抽象成员。尽管该结构未使用seal显式声明,但该结构是隐式的。结构可以从接口继承,方法也可以像类一样从接口继承。

3.初始化:类声明时可以初始化,但结构体声明时不能初始化(结构体中不能初始化字段),否则会报错。

4.构造函数:类和结构有自己的默认构造函数。在类中,一旦我们编写了参数化构造函数,默认构造函数就不存在了。当我们想要调用无参构造函数来初始化一个对象时,我们必须编写自己的无参构造函数。但在一个结构体中,总有一个默认的无参构造函数,并且这个构造函数不能被替换,也不能被覆盖或重写。在一个结构体中,我们只能写有参数的构造函数,而不能写无参的构造函数。

5.析构函数:类有析构函数,但结构没有。

6.关键字:可以在类中使用但在结构体中受到限制的关键字有:abstract、sealed、protected。StaTIc关键字可以用在类名前面,声明静态类;它不能用在结构体前面,没有静态结构体。

,访问速度较快,堆空间较大,但访问速度相对较慢。所以当我们描述轻量级对象时,我们可以将它们定义为结构体以提高效率。例如,点、矩形和颜色是轻量级对象,因为只需要少量字段来描述它们。在描述重量级对象时,我们知道类对象存储在堆空间中,因此我们将重量级对象定义为类。两者都表示可以包含数据成员和函数成员的数据结构。

与类不同,结构是值类型,不需要堆分配。结构类型变量直接包含结构数据,而类类型变量包含对数据的引用(变量称为对象)。结构类型适合表示轻量级对象,例如点、矩形和颜色。虽然可以将点表示为类,但结构在某些情况下更有效。在某些情况下,结构的成本较低。例如,如果声明一个包含1000个点对象的数组,将为每个引用的对象分配额外的内存。因此该结构适合表示轻物体。

类参考资料