c语言数据类型 之 内存对齐与位段

许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值 K(通常是 2、4 或 8)的倍数  k值取 = max{系统对齐大小 ,结构成员对齐大小}  (对齐大小可人为设定)

内存对齐目的:是为了对齐数据以提高存储器的性能,加快内存的读取速度,提高寻址效率。


首先了解一下64位操作系统下不同类型数据所占字节数:

short          : 2 字节

char            : 1 字节           void *   : 8 字节               unsigned char : 1 字节  

short int     : 2 字节           int        : 4 字节               unsigned int    : 4 字节         long int      : 8 字节

float            : 4 字节           double  : 8 字节       

long          : 8 字节             long long     : 8 字节      unsigned long : 8 字节

在C语言中:


struct A                                            

{

} a ;           sizeof(a) = 0;    //空结构体


struct A
{
    char a;
    short b;
    int c;
} a ;            sizeof(a) = 8;      系统对齐2 + 2 + 4 = 8   是2的倍数

/*************************************************************/

struct A
{
    char a;
    long b;
} a ;            sizeof(a) = 16;    系统对齐8  + 8 = 16


struct B
{
      char c;
      A d;
      long long e;
} a ;          sizeof(a) = 32;   系统对齐(最大)8 + 16 +8 = 32   32 = max(8 ,8) * n   (n位整数)

max (系统对齐大小 ,结构体对齐大小)

  /*************************************************************/

struct test

{

      char a;
      short b;
      char c;
      int d;  

} test1 ;              sizeof(test1) = 12;   系统对齐 char 2 + 2 + 系统对齐 char 4+ 4 = 12   12 是4的倍数


struct test2

{

    short b;

    char a;

    char c;

    int d;

}test 3;       sizeof(test3) = 8;


struct A
{
     char a;
     short b;
     int c;
     struct B
     {
           ch ar d;
           double e;
      };
      int f;
} a ;                     sizeof(a) = 12        系统对齐char 2+2+4+4 = 12    12是2的倍数


struct A
{
    char a;
    short b;
    int c;
    struct B
    {
         char d;
         double e;
     } f;
     int g;
} a ;                      sizeof (a) = 32;      系统对齐char 2+2+4+(系统对齐 char 8 +8 = 16) + 4 = 28    max (2,8)=8   28+4=32 为8的倍数  


内存对齐之结构体中添加位段:

struct B
{
    char c1:6;
    char c2:1;
    int in:16;
};         sizeof (b) = 4


标记 c1,c2,in 分别需要 6位  1位  16位   一个字节8位

补充说明:

    struct packed_struct
{
 

    unsigned intf1 :1;
      unsigned intf2 :1;
      unsigned intf3 :1;
      unsigned inttype :4;
      unsigned intindex :7;
};         sizeof(structpackd_struct) = 4

当位段出现在结构定义中时, 至少会占用等同于unsigned  int类型的空间,当所有的位段之和超出,分配另一个unsignedint空间。unsigned char或者其他类型不必考虑。

/************************************枚举类型*************************************/

struct A
{
     enum a{

     INDEX1,
     INDEX2,
     INDEX3,
     INDEX4};
} a ;            sizeof(a) = 0     枚举是类型不是变量不分配变量


/************************************联合体**************************************/


union B
{
short s1;
char c2;
short s2;
int in;
} b ;


union B
{
short s1:6;
char c2:1;
short s2:15;
int in:16;
} b ;
 

两个联合体  sizeof(b) 均为4





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值