自定义类型

结构体类型

  • 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的
    变量
结构体的声明
struct tagtag可以省略)
{ 
 member-list; (结构的成员可以是标量、数组、指针,甚至是其他结构体。)
}variable-list; 

例如:

struct
{   
int a;
Char b;
float c;
}x;

这个声明创建了一个X变量,它包含三个成员:一个整型,字符型和浮点型。

Typedef struct S
{
Int a;
Char b;
}x;

这里的S是一个标签,标签标识了一种模式,用于声明未来的变量,注意S不是变量。

结构体的初始化

结构体初始化时是整体赋值。有以下两种形式:

  1. struct STU
    {
    Char name[10];
    Int age;
    }s={“zhangsan”,20};

  2. struct STU s={“zhangsan”,20};

结构体内存对齐

1、为什么存在内存对齐?

  • 平台原因(移植原因):

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

  • 性能原因:

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

struct S1 
{ 
 char c1; 
 int i; 
 char c2; 
}; 

这里写图片描述
CPU能够直接访问0x20和0x24 由于平台问题无法访问0x21(22,23)所以CPU能够直接访问到C1,但是无法直接访问到I 和C2.所以引入内存对齐概念。

2、什么是内存对齐?

结构体的内存对齐是拿空间来换取时间的做法。

3、如何进行内存对齐?

结构体的对齐规则:

1. 第一个成员在与结构体变量偏移量为0的地址处。

2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 
VS中默认的值为8 
Linux中的默认值为4

3. 结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐
 数)的整数倍。

4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍
处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

例如:
假定对齐数为4
这里写图片描述
c1的偏移量为0,i的对偏移量为为4,c2的偏移量为为8,要求结构体的大小要为最大对齐数的整数倍,所以结构体的大小为(1+3+4+1+3)=12
蓝色填充的内存都是浪费掉的内存

位段

1、成员:位段的成员必须是整形家族成员,例如:int、unsigned int 或signed int 。
2、表示:位段的成员名后边有一个冒号和一个数字。
例如:

struct A 
{ 
 int _a:2; 
 int _b:5; 
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QVariant 是 Qt 中的一个通用的值类型,可以用来存储各种类型的数据,包括基本类型、用户自定义类型、甚至指针等。但是,如果要在 QVariant 中存储用户自定义类型的对象,需要实现 QVariant::Type 类型的转换函数。这个转换函数的基本要求是将自定义类型转换为 QVariant,并将 QVariant 转换回自定义类型。这个过程可以称为类型注册,它将自定义类型与 QVariant 类型关联起来,使得 QVariant 在遇到这种类型时可以正确地进行操作。 要完成 QVariant 自定义类型的实现,首先需要了解 QVariant 的内部实现机制。QVariant 内部使用了一个类似于 Variant 类的黑盒子来存储各种类型的值,在存储、获取、转换值时,需要使用 QVariant 内部提供的接口来进行操作。 接着,将自定义类型与 QVariant 类型进行关联,用户需要实现 QVariant::Type 类型的转换函数。这个函数的实现方式取决于自定义类型的实现机制,可以使用 QVariant 提供的模板类型来序列化与反序列化自定义类型,或者手动实现这些转换函数。 完成了自定义类型与 QVariant 类型之间的关联,就可以将自定义类型的对象存储到 QVariant 中了。存储时,需要将自定义类型的对象转换为 QVariant 类型,这里需要使用 QVariant::fromValue 函数。获取时,则需要将 QVariant 类型转换为自定义类型,这里可以使用 QVariant::value 函数,并传入自定义类型的 TypeId。 总之,QVariant 自定义类型的实现需要实现 QVariant::Type 类型的转换函数,并将自定义类型与 QVariant 类型关联起来,实现自定义类型与 QVariant 类型之间的转换。在实际的应用中,需要根据自定义类型的实现机制来选择相应的序列化与反序列化方式,以便正确存储、获取自定义类型的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值