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

最新文章

  1. servlet中session的使用
  2. tomcat manager配置
  3. for嵌套:1.兔子生兔子问题 2.打印菱形 3.求100以内质数的和
  4. Navi.Soft30.框架.WebMVC.开发手册
  5. C#中往数据库插入/更新时候关于NUll空值的处理
  6. SQL 2008配置管理工具服务显示 远程过程调用失败0x800706be
  7. 实践Oracle与DB2区别及问题解决
  8. SharePoint Srver 2010 资源汇总
  9. 我的C# - Web - DAL- DBHelper.cs
  10. 强制杀oracle进程
  11. Sqoop简介
  12. 剑指Offer 16. 合并两个排序的链表 (链表)
  13. Ansible--配置文件及系列命令
  14. Beta之后的想法
  15. jquery 動畫
  16. 预编译 ASP.NET 网站以进行部署
  17. 【STL学习】堆相关算法详解与C++编程实现(Heap)
  18. Linq-System.Data.Linq.DataContext不包含采用“0”个参数的构造函数
  19. MySQL Date函数的正确用法
  20. CF_884_F(NetFlow)

热门文章

  1. Apache Shiro 反序列化漏洞复现(CVE-2016-4437)
  2. beef抓包简析
  3. 通过城市联动实时将地址显示到text中
  4. nmap安装和使用
  5. 由OptionalLong想到的拆装箱问题
  6. day100:MoFang:用户模型类的创建&amp;Marshmallow模块&amp;使用基本构造器Schema完成数据的序列化转换和反序列化转换
  7. win10下安装anaconda3+tensorflow
  8. Generalizing from a Few Examples: A Survey on Few-Shot Learning 小样本学习最新综述 | 三大数据增强方法
  9. 第5.4节 Python函数中的变量及作用域
  10. url的组成结构信息