Code Tips: gcc对结构体的默认字节“对齐”方式

摘要:
那么,当代码中没有明确的规范时,编译器需要执行对齐时,gcc的默认处理是什么?

1. 发现问题

    最近在编写代码过程中发现,对一个结构体进行 sizeof 操作时,有时候大小是填充过的,有时候又没有填充。

    那么,如果在代码中没有显示的指定要求编译器进行对齐时,gcc的默认处理是怎样的呢?

2. 先说结论

  •     代码中如果没有显示指定字节对齐时,gcc默认并没有进行cpu宽度字节对齐;
  •     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
", sizeof(tTestEntry1));
49     printf("sizeof(tTestEntry2)=%lu
", sizeof(tTestEntry2));
50     printf("sizeof(tTestEntry3)=%lu
", sizeof(tTestEntry3));
51     printf("sizeof(tTestEntry4)=%lu
", sizeof(tTestEntry4));
52 
53     return 0;
54 }

输出结果:

sizeof(tTestEntry1)=3
sizeof(tTestEntry2)=6
sizeof(tTestEntry3)=8
sizeof(tTestEntry4)=12

免责声明:文章转载自《Code Tips: gcc对结构体的默认字节“对齐”方式》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇导入Android Studio 项目报 invalid gradle jdk configuration found3层-CNN卷积神经网络预测MNIST数字下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

c语言处理通过ajax发起http的post请求CGI并向浏览器返会值

环境:centos 6.5 web容器:apache2.4,[<http://httpd.apache.org/docs/2.4/] 准备: cd /usr/local/httpd-2.4.20/modules/generators enter   cp mod_cgi.c /usr/local/apache/bin enter   ....

【转】SSE4.1指令集系列之一

转自:http://www.cnblogs.com/celerychen/archive/2013/04/02/2995586.html 本文要介绍的是SSE4.1指令集中的几条整数指令及其在视频编码中的应用。 1.单指令32字节差分绝对值求和指令MPSADBW 这条指令类似于SSE的PSADBW,但它实现的功能更强大。包括微软官方网站上对这条指令的说明都...

Arduino常用的数据类型以及转换

常用的数据类型有布尔类型、字符型、字节型、整型、无符号整型、长整型、无符号长整型、浮点型、双精度浮点型等 布尔类型bollean: 布尔值是一种逻辑值,其结果只能为真(true)或者假(false)。布尔值可以用来进行计算,最常用的布尔运算符是与运算(&&)、或运算(||)和非运算(!)。 字符型char: 字符型(char)变量可以用来...

扫雷思想及主函数

1.建雷盘(9*9雷盘) 2.初始化雷盘,雷盘1每个位置初始化为字符0,雷盘2每个位置初始化为字符*。 3.为了检验,输出我们初始化好的雷盘。 4.向棋盘放雷,这块我们可以以雷数设计难度。摆雷是以随机数放入的,下面会附上代码,详见代码 5.扫雷。 详细说明一下扫雷的思想: 5.1.先定义int win = 0(用来判断结束的条件)当我们向控制台输入坐标后,...

大端模式与小端模式

一、介绍  超过一个字节的数据在内存中会用几个字节存储,根据数据在内存的存放方式,分大端模式和小端模式。 大端模式是将数据的高位存在内存的低位地址;小端模式而是将数据的高位存在内存的高位地址,以下是十六进制0x12345678在内存地址的两种存储方式(假设数据是按原码存储),0x12345678中,12是高位,78是低位。 大端模式中把高位(12)存在内...

DB2 日期时间函数

db2日期时间函数 (DATE(TRIM(CHAR(DT#11Y))||'-'||TRIM(CHAR(DT#11M))||'-'||TRIM(CHAR(DT#11D))) BETWEEN DATE('" & strDate1 & "') AND DATE('" & strDate2 & "')) (Y > y) OR...