关于C语言字节对齐之结构体 共用体占用字节数的快速计算方法总结

本文介绍了在C语言中,结构体和共用体的字节对齐问题,通过实例解析了如何快速计算它们占用的字节数。在不同平台下,由于字节对齐规则不同,可能导致同样结构体占用字节数的差异,从而影响数据传输和存储。文章总结了计算方法,并强调了字节对齐对CPU快速访问数据的重要性。
摘要由CSDN通过智能技术生成

前几天在做项目时,出现了一个套接字通信的一个问题,看似客户端和服务器端使用的一个相同的结构体,但是就是在服务器端不能把客户端发送的数据全部显示的打印出来。查找了好久的错误,才发现原来两端的结构体看似相同,但其两端结构体占用的字节数是不一样的。才导致了服务器端不能正常的显示出全部内容。

大概情况是这样的,client端定义结构体如下:

typedef  struct _u64{
    long high;
    long low;

}U64;
struct _data_pack{
    int a;
    int b;
    union snmp_data{
   
       long     name;
       U64  	buf1;
       char 	buf2[100];
   }snmp_data_t;

}data_pack_t;
client 这端发送 sizeof(data_pack_t) 的字节到服务端。

服务端定义如下:

typedef unsigned long long U64;
struct _data_pack{
    int a;
    int b;
    union snmp_data{
   
       long 	name;
       U64  	buf1;
       char 	buf2[100];
    }snmp_data_t;

}data_pack_t;

struct data5{

		char c1;
		char c2[2];
};

服务端也接受sizeof(data_pack_t)这么多的字节数。

问题出现了,服务端这边不能不能把共用体中的数据显示的打印出来,查找原因,最后才发现原来两边的结构体大小占用的字节数是不一样的。

client端:sizeof(data_pack_t)= 108

service端:sizeof(data_pack_t)= 112

为此,本人在网上查找了大量有关字节对齐的资料,总结了自己认为快速计算结构体 共用体字节大小的方法,现说明如下:

对于无论是 简单类型的变量 还是结构类型的变量 ,联合类型的变量,在内存中的存储都要按照字节对齐的方式存储。这样存储的主要的目的是能让cpu快速的访问数据。

说到字节对齐,这里有几个重要的概念需要深刻理解 ,记忆:

一 :什么是字节对齐

     就是变量存储的地址是变量的有效字节对齐值的整数倍,即:

     address%最终有效字节对齐值 = 0;

二:关于几种字节对齐值的说明

1 变量的自身字节对齐值

### 回答1: 我了解到共用体结构体是 C 语言中常用的数据类型,它们的最大区别在于共用体只能存储一种类型的数据,而结构体可以存储多种类型的数据。而空洞是指结构体中的字节数不足以容纳它的所有成员变量时,就会出现空洞,从而导致空间浪费。 ### 回答2: C语言中的共用体(union)和结构体(struct)是用来存储不同类型数据的特殊数据类型。 共用体是一种特殊的数据结构,它允许在相同的内存位置存储不同类型的数据。共用体中的所有成员共享同一块内存,每次只能存储其中一个成员的值。共用体的大小取决于它最大的成员变量,它的大小足以容纳所有成员中最长的那个变量。 共用体的主要用途是在相同的内存位置保存不同类型的数据,并根据需要选择正确的数据类型进行访问。这在一些资源受限的嵌入式系统中尤为有用,可以节省内存,提高性能。 结构体是一种允许存储不同类型数据的用户自定义数据类型。它允许将不同类型的数据组合在一起,形成一个逻辑上相关的数据单元。结构体中的每个成员都可以是不同的数据类型,并且可以根据需要访问每个成员。 结构体的大小取决于它的所有成员的大小总和,每个成员在内存中按照声明的顺序依次排列。结构体的使用可以更好地组织和管理数据,减少代码的复杂性。 结构体空洞指的是结构体中未被使用的内存空间。这是由于结构体的对齐原则和内存对齐要求导致的。编译器在分配内存空间时会根据对齐规则添加填充字节,以确保结构体成员变量在特定地址上的访问效率和正确性。填充字节可能会导致部分内存空间未被使用,造成结构体中的空洞。 结构体空洞可能会占用额外的内存空间,但它有助于提高内存访问的效率。同时,可以通过使用预处理指令#pragma pack(1)来取消对齐,从而减少或消除结构体中的空洞。但需要注意,取消对齐可能会导致访问效率降低,特别是在嵌入式系统中。 ### 回答3: C语言中的共用体(union)是一种特殊类型的数据结构,它允许不同的变量共享相同的内存空间。共用体的大小取决于其内部最大成员的大小,并且在任何给定时间只能存储其中一个成员的值。这样可以有效地节省内存空间,使得不同类型的数据可以共享同一块内存。 共用体的定义和使用方式类似于结构体,但是它们的区别在于共用体的成员共享同一块内存,而结构体的成员各自占据不同的内存空间。因此,在使用共用体时需要特别注意成员的类型和存取方式。 结构体空洞(struct padding)指的是在结构体中,由于数据对齐的需求造成的未使用的内存空间。数据对齐是为了提高访问数据的效率,它要求结构体中的每个成员在内存中的地址必须是其自身大小的整数倍。为了满足这一要求,编译器可能会在结构体成员之间或结尾处插入一些空洞字节。 空洞字节的大小取决于编译器和编译选项,可能会导致结构体的大小变大,从而浪费一部分内存空间。为了减少空洞的出现,可以按照成员的顺序将其排列,或者使用编译器提供的指令指定数据对齐方式。 通过理解共用体结构体空洞的概念,我们可以更好地利用C语言的特性,合理管理内存空间,提高程序的效率和性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值