在很多机器上,比如Cell,要求数据结构必须128位对齐。这就对数据结构的定义提出了额外的要求。
一种较直观的方法是:在数据结构中添加pad字节,使得整个数据结构填充为128位,例如:
typedef struct _alf_error_msg{
int error_code;
int error_type;
int extra_error_code;
int error_handle_policy;
unsigned char _pad[128 - 4*4];
} error_msg;
其中_pad数组既是为了使整个数据结构达到128位字节而额外填充的字节。
然而,如果数据结构中出现可变化的结构,如使用#ifdef进行条件编译,那填充字节又该如何确定?
这里有一个trick,可以实现该功能:
typedef union _alf_error_msg{
struct error_msg_content{
int error_code;
int error_type;
#ifdef contion_1
int extra_error_code;
#endif
int error_handle_policy;
}
unsigned char _pad[(sizeof(struct error_msg_content) + 127) & 0xFF80];
} error_msg;
在这里由于extra_error_code不能保证始终存在,因此我们不能确定_pad的字节数。在这里我们使用联合数据类型,将_pad的字节数确定为保证容纳struct _error_msg_content的最小字节数。
根据算法(sizeof(struct) + 127) & 0xFF80,可以确保这点。 注意0x80=128,这点可以确保128位对齐。
分享到:
相关推荐
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然...
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。
讲讲字节对齐吧. /******************************分割线 如果体系结构是不对齐的,A中的成员将会一个挨一个存储,从而sizeof(a)为11。显然对齐更浪费了空间。那么为什么要使用对齐呢?体系结构的对齐和不对齐,是在...
内存对齐 1、平台原因(移植原因):不是所有的硬件...2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问 未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
对于每个RTP会话,AMR净荷有两种模式,分别为节省带宽模式和字节对齐模式,具体采用那种模式,由信令协商决定;采用后一模式可以后可以引入鲁棒排序、帧交叉编码和CRC校验等方式提高语音传输的质量。 以下三种场景...
//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0 Stack_Mem SPACE Stack_Size ;//...
关于数据对齐问题,现在多多少少有了一些接触,简单地说下自己的看法。 1、对齐的背景 大端和小端的问题有必要在这里介绍一下,计算机里面每个地址单元对应着一个字节,一个字节为8bit,对于位数大于8位的处理器来说...
倒排索引是大多数大型文本搜索系统的核心数据结构,索引压缩可以有效地减少倒排索引的空间占用,提升检索效率。针对倒排索引压缩算法中的字节对齐编码进行研究,对于其压缩率不够优秀的问题,提出了分区可变单位编码...
嵌入式软件易于出错问题分析 1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结
1.全局符号 可重定位目标文件 可执行目标文件 全局符号强弱对碰问题 全局变量共享访问和死锁问题 ...3.字节顺序+字节对齐+数据不一致引用 字节顺序 字节对齐 数据不一致引用 综合症问题 4.易出错问题总结
对齐问题主要有3点:变量对齐、结构对齐和数据对齐。前两点是编译器决定的变量映射和结构布局。一点与CPU的架构(CISC/RISC)有关。 在大多数情况下,对齐是编译器和CPU的事情,和程序员没什么关系。但在某些情况下...
在我们的程序中,数据结构还有变量等等都需要占有内存,在很多系统中,它都要求内存分配的时候要对齐,这样做的好处就是可以提高访问内存的速度。 我们还是先来看一段简单的程序: 程序一 #include using ...
但是作为学习嵌入式的必须要明白数据的存储是与数据的结构存在密切联系的,特别是结构体中的内存分配问题。 首先应该明白基本的类型在内存中的大小,char型一般占有1个字节,int型一般占有4个字节,double型一般...
用delphi写的,根据C定义的结构和结构对应的二进制文本数据,解释结构成员的数值的程序。使用cxTreeList控件,需要安装ExpressQuantumTreeList(4.38)控件。支持不同字节对齐定义,支持位定义解释。
将 C 结构表示为标准的 Clojure 数据结构(映射和向量) struct 字段的可定制内存对齐逻辑(默认为 OpenCL 对齐,在必要时插入填充字节) 可扩展的类型注册表,预先配置了通用的 C 和 OpenCL 原语 目前不支持: ...
内存对其是VC++程序设计中一个非常重要的技巧,本文即以实例讲述VC++实现内存对其的方法。具体分析如下: ...结构体大小是处理器位数和结构体内最长数据元素所占字节数二者中较小的那一个的整数倍。
4.1.1.程序运行为什么需要内存1 4.1.2.程序运行为什么需要内存2 4.1.3.位、字节、半字、字的概念和内存位宽 4.1.4.内存编址和寻址、内存对齐 4.1.5.C语言如何操作内存 4.1.6.内存管理之结构体 ...4.1.9、复杂数据结构
一、存储器格式(字对齐) Arm体系结构将存储器看做是从零地址开始的字节...Arm微处理器中支持字节(8位),半字(16位),字(32位)三种数据类型,其中,字需要4字节对齐,半字需要2字节对齐。 注:所谓的指令长度是一条完
你的程序知道filehead_v1这个字符串,就能自动反推出结构体的内存,就可以自动在运行时,算出所需内存的大小,准备一块内存来装这个数据结构。 这里是我所实现的程序的一个最关键部件:C语言头文件解析器。 其中...