首页 > 代码库 > 结构体大小

结构体大小

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

 

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++采取压缩方式;

 

非压缩存储:
sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾 struct T0
sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾    sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾{
sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾        char c:2;
sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾        int i:1;
sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾    };
sizeof:(含位域)结构体内存对齐,压缩存储 - 冰 馨 - 心灵港湾    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) 整个结构体的总大小为最宽基本类型成员大小的整数倍。