0
点赞
收藏
分享

微信扫一扫

结构体进阶----内存对齐,位段

圣杰 2022-03-30 阅读 68

文章目录

1.结构体内存对齐规则详解

我们来看几个代码来理解一下:

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

内存布局是:
在这里插入图片描述
在这里插入图片描述
再看一个:

struct S3
	{
		double d;
		char c;
		int i;
	}

在这里插入图片描述
在这里插入图片描述

那么结构体嵌套的那种怎么算呢?

看题:

struct S4
{
 char c1;
 struct S3 s3;
 double d;
};

在这里插入图片描述

在这里插入图片描述

1.1为什么存在内存对齐?

  1. 平台原因(移植原因):
    不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特
    定类型的数据,否则抛出硬件异常。
  2. 性能原因:
    数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
    原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访
    问。
    总体来说:

2位段

2.1

位段的声明和结构是类似的,有两个不同:
1.位段的成员必须是 int、unsigned int 或signed int 。
2.位段的成员名后边有一个冒号和一个数字。
比如:

struct A {
 int _a:2;
 int _b:5;
 int _c:10;
 int _d:30;
};

A就是一个位段类型。
那位段A的大小是多少?

2.2 位段的内存分配

  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

总的来说

举报

相关推荐

0 条评论