#pragma pack 与#pragma pack(push,1)

news/2025/5/24 2:02:47

#pragma pack是指定数据在内存中的对齐方式,

在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同

 

(1) #pragma pack(1)

     作用:调整结构体的边界对齐,让其以一个字节对齐;

#pragma pack(1) 使结构体按1字节方式对齐

例如1:

struct sample
{
char a;
double b;
};

若不用#pragma pack(1)和#pragma pack()括起来,则sample按编译器默认方式对齐(成员中size最大的那个)。即按8字节(double)对齐,则sizeof(sample)==16.成员char a占了8个字节(其中7个是空字节)

若用#pragma pack(1),则sample按1字节方式对齐sizeof(sample)==9.(无空字节)
比较节省空间啦,有些场和还可使结构体更易于控制

 (2) #pragma pack(push,1)

这是给编译器用的参数设置,有关结构体字节对齐方式的设置

大概是指把原来对齐方式设置压栈,并设新的设置为1

 

例 2:下面的结构各成员空间分配情况:
struct test
{
     char x1;
     short x2;
     float x3;
     char x4;
};
     结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。更改C编译器的缺省字节对齐方式
     在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:
  · 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
     · 使用伪指令#pragma pack (),取消自定义字节对齐方式。

     另外,还有如下的一种方式:
     · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
     · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。

 


https://dhexx.cn/news/show-758957.html

相关文章

拓展欧几里得java_POJ 2142 The Balance 扩展欧几里得

题意:有两种类型的砝码,每种的砝码质量a和b给你,现在要求称出质量为d的物品,要求a的数量x和b的数量y最小,以及xy的值最小。思路:是扩展欧几里得的应用。设ax by 1,求出x和y的值,因为我们要求a…

常量,运算符

1、常量 在Java中,用final修饰常量。 定义常量时就要对常量进行初始化,并且常量在运行期间不能被更改。 为了区别常量与变量,常量取名一般大写。 2、条件运算符 int c ( a > b ) ? a b : a - b; 条件运算符属于三元运算符&#xff0…

flash游戏引擎整理

flash游戏引擎整理 2010-07-25 11:59 by 王喆(nasa), 342 visits, 网摘, 收藏, 编辑 目前已经有很多比较完善的flash游戏引擎,这个我把他们都分类整理出来。希望对大家开发游戏,学习其中的思路有所帮助。不管是flash还是silverlight他们的思想都是共通的…

weblogic怎么换java_WebLogic如何更换64位JDK

使用32位JDK时,JVM一般设置最大设置为1.7G,而现在服务器普遍内存都很大,当然可以通过多个server建立垂直集群来更好的利用资源,但不妨使用64位JDK。虽然WebLogic可以直接在setDomainEnv里指定JAVA_HOME来更改JDK,但肯定…

LightOJ 1336(Sigma Function)

Sigma Function Sigma function is an interesting function in Number Theory. It is denoted by the Greek letter Sigma (σ). This function actually denotes the sum of all divisors of a number. For example σ(24) 123468122460. Sigma of small numbers is easy to…

蜗居客,就是一个传说(1)

蜗居客,就是一个传说(1)传说,何谓传说 ?芙蓉姐姐以貌如天仙,性感世界而独霸天下;马诺姐姐以香车宝马,拜金至上而笑傲江湖;犀利哥哥以装扮独特,个性…

java 调用mybatis_java – 如何使用MyBatis / Spring实现批处理?

我想知道如何使用MyBatis 3& amp;春天3?例如,这是现在正在做的:${context.factory}MyService.xml:insert into ... // code removedMyService.java:public interface MyService {public void insertMyRecord (MyRecord);}MyCo…

大数据_学习_02_目录贴_大数据学习总结

一、目录 1.第一章:hadoop_学习_02_Hadoop环境搭建(单机) 2.第二章:hbase_学习_01_HBase环境搭建(单机) 3.第三章:hive_学习_01_hive环境搭建(单机)

游戏服务器的架构设计

游戏服务器的架构设计 游戏服务器的设计是一项颇有挑战性的工作,游戏服务器的发展也由以前的单服结构转变为多服机构,甚至出现了bigworld引擎的分布式解决方案,最近了解到Unreal的服务器解决方案atlas也是基于集群的方式。 负载均衡是一个很…

mysql远程连接必须在同一网络下吗_如何允许MySQL数据库服务器的远程连接

默认情况下,MySQL服务器仅侦听来自本地主机的连接,这意味着它只能由运行在同一主机上的应用程序访问。但是,在某些情况下,有必要从远程位置访问MySQL服务器。例如,当您想从本地系统连接到远程MySQL服务器时&#xff0c…