首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

结构体对齐,字节对齐

# 结构体对齐,字节对齐

1、原因:

- 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

- 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

2、规则

1. 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

2. 结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

3. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。

3、定义结构体对齐

可以通过预编译命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是指定的“对齐系数”。

# 多态与虚函数

1. 什么是多态?

简单来说,多态是不同对象同种行为产生不同状态

即在不同继承关系的类对象,去调用同一函数,产生了不同的行为

2. 什么是重载、重写(覆盖)、重定义(隐藏)?

重载:在同一作用域中,函数名相同和参数不同构成重载

重写:在基类和继承类域中,对于虚函数,函数名,参数和返回值相同(特例除外),构成重写

重定义:在基类和继承类域中,函数名相同,不构成重载就构成重定义

3. 多态的实现原理?

对于虚函数类会在对象的成员变量中生成虚函数表指针,指向的虚函数表中出 了该对象的虚函数地址

对于派生类会继承基类的虚函数表,如果派生类重写了虚函数,则会对继承的虚函数表中对应的函数地址进行覆盖成派生类对象的虚函数

当对象调用虚函数时会先找到虚函数表,通过虚函数表找到对应的虚函数,由此构成多态

4. inline函数可以是虚函数吗?

可以,不过编译器会忽略inline属性,这个函数就不再是inline,因为虚函数要放到虚表中去

5. 静态成员可以是虚函数吗?

不能,因为静态成员函数没有this指针,不能通过对象指针找到其虚函数表,使用类型::成员函数的调用方式无法访问虚函数表,所以静态成员函数无法放进虚函数表

6. 构造函数可以是虚函数吗?

不能,因为对象中的虚函数表指针是在构造函数初始化列表阶段才初始化的,如果构造函数为虚函数,会先在对象中的虚函数查找对应虚函数,而此时虚函数表没有生成(动态多态是运行时绑定)

7. 析构函数可以是虚函数吗?什么场景下析构函数是虚函数?

可以,并且最好把基类的析构函数定义成虚函数

当基类指针指向new出来的基类对象或new出来的派生类对象时,需要使用指针进行释放对象,此时需要析构函数为虚函数,保证指针指向的对象成功释放

8. 对象访问普通函数快还是虚函数更快?

如果是普通对象,是一样快的

如果是指针对象或者是引用对象,则调用的普通函数块,因为构成多态,运行时调用虚函数需要到虚函数表中去查找

9. 虚函数表是在什么阶段生成的,存在哪的?

虚函数表是在编译阶段(对象构造时)就生成的,一般情况下存在代码段(常量区)的

10. C++菱形继承的问题?虚继承的原理?

菱形继承存在数据冗余和二义性的问题

虚继承会让继承的父类在成员变量中生成虚基表指针,指向虚基表会储存其继承的基类成员变量距离其成员变量的距离,通过该距离找到其基类成员变量,而两个继承的父类中的虚基表指向同一份父类的父类成员变量;注意:不要把虚函数表和虚基表搞混了

11. 什么是抽象类?抽象类的作用?

抽象类用来表示现实中一些抽象的事物类型,抽象类不具有实例,派生类只是继承其虚函数接口,它强制派生类重写虚函数,否则派生类也是抽象函数

抽象类体现出了接口继承关系 ,以及用来更好地表示现实中一些抽象的事物类型

# 序列化

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

序列化主要有两个用途

1. 把对象的字节序列永久保存到硬盘上,通常存放在一个文件中(序列化对象)

2. 在网络上传送对象的字节序列(网络传输对象)

实际上就是将数据持久化,防止一直存储在内存当中,消耗内存资源。而且序列化后也能更好地便于网络运输和传播

序列化:将java对象转换为字节序列

反序列化:把字节序列恢复为原先的java对象

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230402A04JMT00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券