C温故补缺(九):字节对齐与排序

字节对齐与排序

字节对齐的原因与字节排序

取自:VisualEther
原文档下载:Gitee

_packed

_packet用于结构体中变量在内存中的对齐.如

typedef struct test_s{
   int i;
   char a[3];
   char b[5];
   char c;
}test_t;

如果按默认对齐方式,不足四字节的按四字节算,那么,

int+char[3]+char[5]+char=24个字节

如果用_packet对齐,就是13个字节

但是在VS2008以后就弃用了这个功能

位域

位域:是定义在结构体中的指定了变量宽度的变量 (变量宽度的单位是bit/位)

#include<stdio.h>
struct data{
    int i;
    int j;
}d;
struct Data{
    int i:1;
    int j:1;
}D;

int main(){
    printf("%d ",sizeof(d));
    printf("%d ",sizeof(D));
    printf("\n");
}

输出的结果是8和4

int型占4个字节,但指定两位的位域后,输出的却是4个字节?

因为C语言有默认的对齐方式,段内按4字节对齐,所以虽然Data只用了两位,仍要申请4字节的内存

所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

格式:

struct 位域结构名 {

 位域列表
 type [member_name] : width ;
 ...
};

type:只能是int,unsigned int和signed int三种

一般说,一个位域只能在一个字节中,一个字节可以有多个位域,有时为了对齐,会填充空位域

struct bs{
    unsigned a:5;
    unsigned  :3;    /* 空域 */
    unsigned b:4;    /* 从下一单元开始存放 */
    unsigned c:4
}

如bs的第一个字节只存放a这一个位域,剩下的3位放不下b,c,所以用空位域对齐

位域调用类似结构体变量,用' . '或' -> '成员运算符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值