校招热题:struct结构体的内存对齐

简介: 校招热题:struct结构体的内存对齐

1.什么是内存对齐

谈到这个问题,就要涉及到结构体大小如何计算的问题了。

1. struct s1
2. {
3.  char a;
4.  int b;
5. };

这个结构体占用多大内存呢?我们用函数sizeof()计算一下

printf("%d", sizeof(struct s1));

结果如下

为什么是8呢,char类型和int类型总大小不应该是5字节吗?这里就因为有内存对齐的存在,导致最终大小为8字节。下面详细介绍内存对齐。

2.内存对齐详解--

内存对齐有四条规则

1.结构体的第一个成员永远放在0偏移处.

2.其他成员要对齐到此成员对齐数 整数倍 的偏移处.此成员对齐数=编译器默认对齐数与成员自身大小的较小值.(vs默认对齐数是8)

3.结构体总大小必须是所有成员的对齐数中最大对齐数的整数倍.如果不是,则浪费空间补齐.

4.当结构体内部嵌套一个结构体,这个结构体的对齐数是这个结构体的内部成员最大对齐数,且结构体最终大小必须是所有对齐数中最大的对齐数(包含嵌套的结构体内部的对齐数)。

3.内存对齐的意义.

       1.平台原因(移植原因)

           A   不是所有的硬件平台都能访问任意地址上的任意数据的;

           B    某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

       2.性能原因:

           A   数据结构(尤其是栈)应该尽可能地在自然边界上对齐。

           B  原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

 

相关文章
|
11月前
|
编译器 C语言 C++
C/C++内存对齐规则(结构体、联合体、类)
C/C++内存对齐规则(结构体、联合体、类)
|
12月前
|
安全 C++
【自定义类型:结构体,枚举,联合】内存对齐的原理和原因
【自定义类型:结构体,枚举,联合】内存对齐的原理和原因
70 0
|
12月前
|
编译器 Linux C语言
【C语言】自定义类型:结构体(内存对齐),枚举,联合
【C语言】自定义类型:结构体(内存对齐),枚举,联合
|
5月前
|
存储 编译器 Linux
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
|
2月前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧
|
4月前
|
编译器 测试技术 C语言
【C语言】:自定义类型:结构体的使用及其内存对齐
【C语言】:自定义类型:结构体的使用及其内存对齐
52 7
|
4月前
|
存储 编译器 C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)一
46 2
|
4月前
|
编译器 Linux C语言
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
C语言学习记录——结构体(声明、初始化、自引用、内存对齐、结构体设计、修改默认对齐数、结构体传参)二
42 1
|
5月前
|
编译器 C++
内存对齐与内存开辟。结构体(struct),位段,枚举类型(enum),联合体(union)。
内存对齐与内存开辟。结构体(struct),位段,枚举类型(enum),联合体(union)
32 1
|
5月前
|
编译器 C语言 C++
c语言结构体的内存对齐
c语言结构体的内存对齐