校招热题: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  原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

 

相关文章
|
编译器 C语言 C++
C/C++内存对齐规则(结构体、联合体、类)
C/C++内存对齐规则(结构体、联合体、类)
|
安全 C++
【自定义类型:结构体,枚举,联合】内存对齐的原理和原因
【自定义类型:结构体,枚举,联合】内存对齐的原理和原因
93 0
|
9月前
|
存储 编译器 Linux
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
匿名结构体类型、结构体的自引用、结构体的内存对齐以及结构体传参
|
3月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
273 13
|
3月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
111 11
|
3月前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
54 3
|
3月前
|
存储 Java 程序员
结构体和类的内存管理方式在不同编程语言中的表现有何异同?
不同编程语言中结构体和类的内存管理方式既有相似之处,又有各自的特点。了解这些异同点有助于开发者在不同的编程语言中更有效地使用结构体和类来进行编程,合理地管理内存,提高程序的性能和可靠性。
58 3
|
3月前
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
3月前
|
存储 缓存 算法
结构体和类在内存管理方面有哪些具体差异?
【10月更文挑战第30天】结构体和类在内存管理方面的差异决定了它们在不同的应用场景下各有优劣。在实际编程中,需要根据具体的需求和性能要求来合理选择使用结构体还是类。
|
6月前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧

热门文章

最新文章