自定义类型

结构体类型

  • 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的
    变量
结构体的声明
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; 
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值