码迷,mamicode.com
首页 > 其他好文 > 详细

结构体大小

时间:2014-05-19 14:15:02      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:blog   code   c   tar   http   int   

对齐规律:占用最大成员类型的整数倍,每个成员的对齐地址为该成员类型的整数倍

 

struct

{

  int a; 0-3

char b;4-5

   int c;8-11

}:12

含位域:

使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

struct test
 {
  char a:1;
  char :2;
  char b:3;
  char c:2;
 };
 test t1;
 int len=sizeof(t1);   //len=1
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

struct test
{
char a:1;0-1
char :2;0-1
char :6;1-2
}; 2


3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;

 

非压缩存储:
bubuko.com,布布扣 struct T0
bubuko.com,布布扣bubuko.com,布布扣    bubuko.com,布布扣{
bubuko.com,布布扣        char c:2;
bubuko.com,布布扣        int i:1;
bubuko.com,布布扣    };
bubuko.com,布布扣    cout << "struct T0{ char c:2; int i:1;} = " << sizeof(T0) << endl; //dev c++:4  vc6:8
依然要满足不含位域结构体内存对齐准则第2条,i成员相对于结构体首地址的偏移应该是4的整数倍,所以c成员后要填充3个字节,然后再开辟4个字节的空间作为int型,其中4位用来存放i,所以上面结构体在VC中所占空间为8个字节;而对于采用压缩方式的编译器来说,遵循不含位域结构体内存对齐准则第2条,不同的是,如果填充的3个字节能容纳后面成员的位,则压缩到填充字节中,不能容纳,则要单独开辟空间,所以上面结构体T0在GCC或者Dev-C++中所占空间应该是4个字节
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;

struct test
{
char a:1;0-1
char :2;0-1
long c;4-7
char :6;7-8
};:12


5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

 

 

结构体大小,布布扣,bubuko.com

结构体大小

标签:blog   code   c   tar   http   int   

原文地址:http://www.cnblogs.com/jsy306/p/3735299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!