【C语言】结构体占用字节数及存储与空间分配

我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等。

在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小,下面我们看几个例子:

1.

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

这里char占1个字节,int占4个字节,short占2个字节,按单元存放如下图:

  1  2  3  4

a      
b b b b
c c    

由于a占用了1个字节,b存不下,所以开辟新的单元存放b,然后再开辟新的单元存放c。

从这里可以看出结构体在内存中是按单元存放的,总占用字节数就是3*4=12。

2.

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

存放如图:

  1  2  3  4

a  
b b b b

在这里由于b占用4个字节,而a和c总共才占用3个字节,足够c存放,所以c存放在a的后面,再开辟新的单元存放b。

此例中占用字节数为2*4=8。

3.

struct c
{
  char a;
  char b[2];
  char c[4];
}str3;

存放如图:

  1  2  3  4  5  6  7

a b b c c c c

这里由于数据类型都为char类型,故不必再开辟新的单元,一行存完。

占用字节数为1*1+2*1+4*1=7。

综上所述,结构体在内存中存放是按单元存放的,所开辟单元的最大长度取决于占字节最大的数据类型,此外我们可以发现存储顺序对空间的使用率有一定的影响。

从以上三例可以看出,第一种最浪费空间;第三种最节省空间,但全使用相同类型,丢失了字段本生的数据类型,不方便使用;第二种介于第一种和第三种写法之间,其空间上比较紧凑,同时又保持了结构体中字段的数据类型。大家可以尝试用sizeof()去深入了解结构体中的按单元存放。

时间: 2024-12-24 10:34:14

【C语言】结构体占用字节数及存储与空间分配的相关文章

C语言结构体的字节对齐原则

转载:http://blog.csdn.net/shenbin1430/article/details/4292463 为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址

【转】C语言结构体的字节对齐原则

原文链接:http://blog.csdn.net/shenbin1430/article/details/4292463 为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定

C语言结构体变量字节对齐问题总结

结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐. 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据: 2)提高存取数据的速度.比如有的平台每次都是从偶地址处读取数据,对于一个int型的

C语言结构体在内存中的存储情况探究------内存对齐

条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类型:%d\n", sizeof(int)); printf("float类型:%d\n", sizeof(float)); printf("double类型:%d\n", sizeof(double)); return; } 结果: 先来一下, 这个结构体在内

C语言结构体的字节对齐

Test Code: 1 #include <iostream> 2 #include <cstring> 3 4 using namespace std; 5 6 struct A{ 7 int a; 8 short b; 9 char d; 10 char e[10]; 11 }; 12 13 struct B{ 14 int a; 15 short b; 16 char *c; 17 char d; 18 char e[10]; 19 }; 20 21 int main(){

9、C语言——结构体

结构体 构造-定义-使用 构造类型--结构体类型 类型是用来定义变量的 结构体类型 使用结构体变量.结构体数组.结构体指针变量 一.结构体类型 1.构造结构体类型 struct 结构体类型名--遵循用户的标识符 { 成员1的定义 成员2的定义 ...... 成员n的定义 }; eg: struct student { int sn; int age; char sex; int s[3]; }:此处的分号不能省略· struct 是构造结构体类型的标志 其中的student不是变量名,是构造的体

漫谈C语言结构体struct、公用体union空间占用

先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; union union_data1{ short a;//本身占用2个字节 char b[13];//本身占用13个字节 int c ;//本身占用4个字节 }; struct struct_data{ int a ;//int本身占用4个字节,偏移量为0 char b ;//char本身占用1个字节,偏移量为

C语言结构体声明中冒号的使用(占位符) &amp; C结构体的乱序初始化

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段".所谓"位域"是把一个字节中的二进位划分为几 个不同的区域,并说明每个区域的位数.每个域有一个域名,允许在程序中按域名进行操作.这样就可以把几个不同的对象用一个字节的二进制位域来表示.一.位 域的定义和位域变量的说明位域定义与

程序设计基石与实践系列之失落的C语言结构体封装艺术

英文来源于 Eric S. Raymond-- The Lost Art of C Structure Packing 谁该阅读这篇文章 本文是关于削减C语言程序内存占用空间的一项技术--为了减小内存大小而手工重新封装C结构体声明.你需要C语言的基本知识来读懂本文. 如果你要为内存有限制的嵌入式系统.或者操作系统内核写代码,那么你需要懂这项技术.如果你在处理极大的应用程序数据集,以至于你的程序常常达到内存的界限时,这项技术是有帮助的.在任何你真的真的需要关注将高速缓存行未命中降到最低的应用程序里