C语言优化学习——结构体定义优化

转载 2015年11月17日 16:17:22

原文链接 http://blog.csdn.net/fb2058/article/details/15502071

 

编译器 VS2013

在这之前需要知道各种数据类型占用的字节数

char—1个  short—2个  Int—4个  float—4个  long—4个 double—8个

 

首先定义两个结构体 A 和 B,A和B里面的数据是一样的,不同的是数据顺序不一样。

typedef struct
{
	char a;
	short c;
	int b;
}A;

typedef struct
{
	char a;
	int b;
	short c;
}B;

 

主程序

printf("结构体A占用字节:%d字节\n结构体B占用字节:%d字节\n",sizeof(A),sizeof(B));

 

很多人认为这两个结构体所占用的字节数应该是一样的(1+2+4=7),实际上不是的。


实际运行结果

 

看到这里可能很多人就有疑问了,为什么会这样呢,两者相差的4个字节在哪呢,下面详细解释。

需要注意的是结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。

对于结构体A和B来说最大基本类型是Int,也就是单元大小为4个字节。

先来计算结构体A占用的字节数

因为a只占用一个字节,所以第一个单元放完a后还剩3个字节,而c只占2个字节,所以c紧接着放在a后面;放完a,c之后第一个单元还剩1个字节,放不下b了,另外再开辟一个单元放b。最终结构体A所占的字节为 4+4 = 8 字节

 

再来计算结构体B占用的字节数

因为a只占用一个字节,所以第一个单元放完a后还剩3个字节,而b要占4个字节,第一个单元不够放,所以另外开辟一个单元放b,第二个单元用完了,另外开辟一个单元放c。最终结构体B所占的字节为 4+4+4 = 12 字节

 

所以结构体B比A多出来的4个字节就在这里。

相关文章推荐

被遗忘的C结构体打包技术

原文见 http://www.catb.org/esr/structure-packing/ 。 作者是著名hacker。 虽然讲的是C语言中一个很基本的概念,但条理清楚,读后仍能获得不少启发。 特别...

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我...

keil 中——C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!            以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则...
  • Cowena
  • Cowena
  • 2015年11月09日 09:02
  • 2509

C语言基础学习——第9天(结构体、联合、枚举)

C语言基础学习——第9天(结构体、联合、枚举)

C语言学习——结构体(struct)的使用

结构化可以创建一个新的数据类型,得到的数据类型类似于java中的对象。 定义新类型 使用新类型 单个变量 初始化 赋值 输出 多个变量 初始化 赋值 输出 关于新类型的一些其他应用 新类型的变量之间可...

【IOS 开发学习总结-OC-7.5】objective-c 的c语言特性——结构体

有时候,程序需要多个基本类型的组成一个有机整体,比如说定义一个矩形,就需要 x,y,width,height 4个值。这就需要使用 语言提供的结构体。 定义结构体 语法格式: struct...

c语言学习笔记(10)——结构体

------------------------------------------------------------------ # include struct Student{  //S...

详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法!

以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧!         后来学会了在keil里进行模块化编程...
  • dcx1205
  • dcx1205
  • 2013年06月14日 22:08
  • 3837

C语言中,为什么结构体后面经常定义一个空数组

最近在写C代码,经常看到Linux 的头文件中有的结构体后面会定义一个空数组,不知道其为何作用?经过高人指点终于明白其要点! struct inotify_event { __s32 wd; ...

C语言回顾之结构体、枚举、宏定义、typedef、extern和static的使用

一、结构体 1、什么是结构体 由多个不同类型的数据构成一个整体 2、定义结构体步骤 (1)定义结构体类型 (2)根据结构体类型,定义结构体变量 例如: #include int main() {...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言优化学习——结构体定义优化
举报原因:
原因补充:

(最多只允许输入30个字)