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

目录

 

1.什么是内存对齐?

2.内存对齐详解--

3.内存对齐的意义.


1.什么是内存对齐?

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

struct s1
{
	char a;
	int b;
};

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

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

结果如下

da914ca91f8848d8940656a1f490da95.png

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

扫描二维码关注公众号,回复: 16137539 查看本文章

2.内存对齐详解--

内存对齐有四条规则

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

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

66f6c2b5c824417ba3190575c2c1032b.png

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

db61233708754051bc0e19badc0c0161.png

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

3.内存对齐的意义.

        1.平台原因(移植原因)
            A   不是所有的硬件平台都能访问任意地址上的任意数据的;
            B    某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
        2.性能原因:
            A   数据结构(尤其是栈)应该尽可能地在自然边界上对齐。

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

猜你喜欢

转载自blog.csdn.net/2301_76144863/article/details/129827527