首页 > 其他分享 >C温故补缺(九):字节对齐与排序

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

时间:2022-11-12 15:56:03浏览次数:71  
标签:字节 int char 对齐 位域 温故 struct

字节对齐与排序

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

取自: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,所以用空位域对齐

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

标签:字节,int,char,对齐,位域,温故,struct
From: https://www.cnblogs.com/Tenerome/p/Creview9.html

相关文章

  • C温故补缺(八):结构体与共用体
    结构体与共用体结构体是一个可以存储多个不同类型的变量的结构,类似于面对对象中的类(只有成员变量的类).structtag{member-listmember-listmember-......
  • [其他] 字节byte不总是内存中的最小寻址单位(极少情况下不是)
    结论:在不同的机器架构上,甚至在特定的操作系统上,最小的内存寻址单位都可能不同,但是在大部分情况下字节就是最小的内存寻址单位,c和c++标准都有明确的要求。另外,物理内存是不存......
  • C温故补缺(七):函数指针与回调函数
    函数指针与回调函数函数指针就是指向函数调用栈地址的指针,定义时须和函数的返回值类型,参数类型相同如:#include<stdio.h>intmax(intx,inty){returnx>y?x:y;......
  • Java安全之动态加载字节码
    Java字节码简单说,Java字节码就是.class后缀的文件,里面存放Java虚拟机执行的指令。由于Java是一门跨平台的编译型语言,所以可以适用于不同平台,不同CPU的计算机,开发者只需......
  • C温故补缺(六):C反汇编常用的AT&Tx86语法
    C语言反汇编用到的AT&Tx86汇编语法参考:CSDN1,CSDN2默认gcc-S汇编出的,以及反汇编出的,都是AT&Tx86代码,可以用-masm=intel指定为intelx86汇编格式gcc-Stest.c-m......
  • C温故补缺(五):main函数的参数
    main()的参数main()函数的参数,用于在外部执行时传入参数,类似windows的bat脚本或linux的sh脚本.在bat脚本中传入参数,用%接收.sh脚本的参数用$接收.c语言编译成可执行文......
  • 【JSR269实战】之编译时操作AST,修改字节码文件,以实现和lombok类似的功能
    参考:https://blog.csdn.net/justry_deng/article/details/106176181maven编译不成功。笔者日常****:兄弟姐妹们,还是尽量少熬夜啊。我感觉我记性有所下降,难受。需求说......
  • 温故而知新——Java双列集合Map&Stream流
    总体目录:01-双列集合的特点02-Map集合常用的APIMap是顶层接口,常用方法如下:size()、isEmpty()、clear()方法容易理解;put()方法的细节:如果第一次添加元素,返回值为null......
  • VBA代码自动缩进排版 VBA代码对齐排版工具
    VBA代码助手下载地址视频演示空白区双击Tab键对当前过程排版代码区右键菜单对齐排版可关闭双击Tab自动排版VBA代码助手下载地址......
  • C温故补缺(四):GDB
    gdbgdb是由GNU软件社区提供的CDebug工具Pre在调试前,需要先编译.c程序,且要加上-g使输出文件变得可调式gcctest.c-g-otest用gdbtest来调试程序,用quit退出调试......