0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

c语言中的字节对齐

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-12-30 11:03 次阅读

在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。

在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相同。

查看源图像

C编译器缺省的结构成员自然对界条件为“N字节对齐”,N即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。

C编译器缺省的结构整体的自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为“结构整体自然对界条件的整数倍,则在最后一个成员后填充空字节。

struct Test
{ 
char x1; // 成员x1为char型(其起始地址必须1字节对界),其偏移地址为0
char x2; // 成员x2为char型(其起始地址必须1字节对界,其偏移地址为1
float x3; // 成员x3为float型(其起始地址必须4字节对界),编译器在x2和x3之间填充了两个空字节,其偏移地址为4
char x4; // 成员x4为char型(其起始地址必须1字节对界),其偏移地址为8
};

因为Test结构体中,最大的成员为flaot x3,因些此结构体的自然对界条件为4字节对齐。则结构体长度就为12字节,内存布局为1100 1111 1000。

#include //#pragma pack(2)typedef struct
{
  int aa1; //4个字节对齐 1111  char bb1;//1个字节对齐 1  short cc1;//2个字节对齐 011  char dd1; //1个字节对齐 1  } testlength1;
int length1 = sizeof(testlength1); //4个字节对齐,占用字节1111 1011 1000,length = 12
typedef struct
{
  char bb2;//1个字节对齐 1  int aa2; //4个字节对齐 01111  short cc2;//2个字节对齐 11  char dd2; //1个字节对齐 1  } testlength2;
int length2 = sizeof(testlength2); //4个字节对齐,占用字节1011  1111 1000,length = 12

typedef struct
{
  char bb3; //1个字节对齐 1  char dd3; //1个字节对齐 1  int aa3; //4个字节对齐 001111  short cc23//2个字节对齐 11
  } testlength3;
int length3 = sizeof(testlength3); //4个字节对齐,占用字节1100 1111 1100,length = 12

typedef struct
{
  char bb4; //1个字节对齐 1  char dd4; //1个字节对齐 1  short cc4;//2个字节对齐 11  int aa4; //4个字节对齐 1111  } testlength4;
int length4 = sizeof(testlength4); //4个字节对齐,占用字节1111 1111,length = 8int main(void)
{
  printf("length1 = %d.n",length1);
  printf("length2 = %d.n",length2);
  printf("length3 = %d.n",length3);
  printf("length4 = %d.n",length4);
  return 0;
}

对齐规则为:

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

结合1、2推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

因此,当使用伪指令#pragma pack (2)时,Test结构体的大小为8,内存布局为11 11 11 10。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19118

    浏览量

    305020
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136776
  • 编译器
    +关注

    关注

    1

    文章

    1634

    浏览量

    49128
  • 编译
    +关注

    关注

    0

    文章

    657

    浏览量

    32868
  • 字节对齐
    +关注

    关注

    0

    文章

    5

    浏览量

    1512
收藏 人收藏

    评论

    相关推荐

    C语言进阶】面试题:请使用宏定义实现字节对齐

    C语言进阶】面试题:请使用宏定义实现字节对齐
    的头像 发表于 07-11 09:21 2793次阅读
    【<b class='flag-5'>C</b><b class='flag-5'>语言</b>进阶】面试题:请使用宏定义实现<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>

    单片机c语言中定义字节怎么定义

    定义位可以用***it但是定义字节呢?还有就是比如汇编中的DPTR的DPH和DPL在c语言中怎样定义的呢?
    发表于 02-23 14:50

    请问C语言中能高效方式跟换字节位置吗?

    C语言中有没有一种高效方式跟换字节中的BIT位置,如:76543210更换成自己想要的规格如:45670123或者46570213等等。
    发表于 03-06 04:35

    详解C语言字节对齐

      一、什么是对齐,以及为什么要对齐:   1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是
    发表于 08-29 10:11 1255次阅读

    C语言中指针的介绍非常详细

    C语言中指针的介绍非常详细 C语言中指针的介绍非常详细
    发表于 12-25 10:39 57次下载

    C语言和汇编语言混合编程方法和C语言中断处理方法

    C语言和汇编语言混合编程方法和C语言中断处理方法,new
    发表于 01-06 14:36 36次下载

    C语言中的关键字

    C语言中的入门教程
    发表于 10-14 16:24 3次下载

    总结那么几个C语言中的“坑”

    总结几个C语言中的“坑”
    的头像 发表于 01-16 10:52 2573次阅读

    解析C语言结构体字节如何对齐

    01 默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这
    的头像 发表于 06-12 17:42 3071次阅读

    C语言中Linux字节对齐的问题

    ,于是经过排查,是因为传递消息的结构体没有考虑字节对齐的问题。 随手整理一下C语言中字节对齐的问
    的头像 发表于 08-16 11:25 2482次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言中</b>Linux<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>的问题

    STM32 终极字节对齐解析

    一、全局变量对齐问题:基本上用户定义的变量是几个字节就是几字节对齐,这个比较好理解。uint8_t定义变量地址要1字节
    发表于 11-23 18:06 11次下载
    STM32 终极<b class='flag-5'>字节</b><b class='flag-5'>对齐</b>解析

    C语言 | 内存对齐01 - 什么是内存对齐

    一、前言在单片机下使用C语言编程时,内存对齐的知识点必须掌握。掌握内存对齐后,可以防止内存碎片化,单片机有限的内存被更加有效地使用。二、内存对齐
    发表于 01-13 15:18 0次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b> | 内存<b class='flag-5'>对齐</b>01 - 什么是内存<b class='flag-5'>对齐</b>

    c#语言中怎么使用HTTP代理

    c#语言中怎么使用HTTP代理。
    的头像 发表于 09-01 14:46 2151次阅读

    C/C++编译器的缺省字节对齐方式

    C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。
    的头像 发表于 04-15 11:24 1012次阅读

    C语言中的socket编程基础

    Socket编程简介 Socket是一种通信机制,允许程序之间进行通信。在C语言中,socket编程是网络编程的基础。通过使用socket,程序可以发送和接收数据,实现不同计算机之间的通信
    的头像 发表于 11-01 16:51 311次阅读