Linux杂谈: gcc对结构体大小的默认处理方式
2024-09-05 17:50:53
1. 发现问题
最近在编写代码过程中发现,对一个结构体进行 sizeof 操作时,有时候大小是填充过的,有时候又没有填充。
那么,如果在代码中没有显示的指定要求编译器进行对齐时,gcc的默认处理是怎样的呢?
2. 先说结论
- 代码中如果没有显示指定字节对齐时,gcc默认是不会进行字节对齐的;
- gcc会将结构体的大小填充为结构体成员中最大成员的整数倍(如果结构体中的成员也是一个结构体,则查看这个成员的成员,)
3. 实验
根据实验代码,可以清晰的理解gcc对结构体的默认处理行为
1 /*--------------------------------------
2 * struct_size.c
3 * author: taopeng
4 * -------------------------------------*/
5
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 /* 成员最大size为1, 无须再填充*/
10 typedef struct
11 {
12 char a;
13 char b;
14 char c;
15 }tTestEntry1;
16
17 /* 成员最大size为2,需要将大小填充为2的倍数 */
18 typedef struct
19 {
20 char a;
21 char b;
22 char c;
23 short d;
24 }tTestEntry2;
25
26 /* 成员最大size为4,需要将大小填充为4的倍数 */
27 typedef struct
28 {
29 char a;
30 int b;
31 }tTestEntry3;
32
33 /* 成员最大size为4,需要将大小填充为4的倍数
34 * 内部有结构体,继续查看内部结构体成员 */
35 typedef struct
36 {
37 struct
38 {
39 char a;
40 int b;
41 }t;
42
43 int c;
44 }tTestEntry4;
45
46 int main(int argc, char *argv[])
47 {
48 printf("sizeof(tTestEntry1)=%lu\r\n", sizeof(tTestEntry1));
49 printf("sizeof(tTestEntry2)=%lu\r\n", sizeof(tTestEntry2));
50 printf("sizeof(tTestEntry3)=%lu\r\n", sizeof(tTestEntry3));
51 printf("sizeof(tTestEntry4)=%lu\r\n", sizeof(tTestEntry4));
52
53 return 0;
54 }
输出结果:
sizeof(tTestEntry1)=3
sizeof(tTestEntry2)=6
sizeof(tTestEntry3)=8
sizeof(tTestEntry4)=12
最新文章
- servlet中session的使用
- tomcat manager配置
- for嵌套:1.兔子生兔子问题 2.打印菱形 3.求100以内质数的和
- Navi.Soft30.框架.WebMVC.开发手册
- C#中往数据库插入/更新时候关于NUll空值的处理
- SQL 2008配置管理工具服务显示 远程过程调用失败0x800706be
- 实践Oracle与DB2区别及问题解决
- SharePoint Srver 2010 资源汇总
- 我的C# - Web - DAL- DBHelper.cs
- 强制杀oracle进程
- Sqoop简介
- 剑指Offer 16. 合并两个排序的链表 (链表)
- Ansible--配置文件及系列命令
- Beta之后的想法
- jquery 動畫
- 预编译 ASP.NET 网站以进行部署
- 【STL学习】堆相关算法详解与C++编程实现(Heap)
- Linq-System.Data.Linq.DataContext不包含采用“0”个参数的构造函数
- MySQL Date函数的正确用法
- CF_884_F(NetFlow)
热门文章
- Apache Shiro 反序列化漏洞复现(CVE-2016-4437)
- beef抓包简析
- 通过城市联动实时将地址显示到text中
- nmap安装和使用
- 由OptionalLong想到的拆装箱问题
- day100:MoFang:用户模型类的创建&;Marshmallow模块&;使用基本构造器Schema完成数据的序列化转换和反序列化转换
- win10下安装anaconda3+tensorflow
- Generalizing from a Few Examples: A Survey on Few-Shot Learning 小样本学习最新综述 | 三大数据增强方法
- 第5.4节 Python函数中的变量及作用域
- url的组成结构信息