#pragma pack && __attribute__ aligned

使用伪指令#pragma pack (n),编译器将按照n个字节对齐。
使用伪指令#pragma pack (),取消自定义字节对齐方式。

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

时间: 2024-08-13 20:48:19

#pragma pack && __attribute__ aligned的相关文章

C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   二.为什么要字节对齐   需要字节对齐的根本原因在于CPU访问数据的效率问题.假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访

转载: #pragma pack(push,1) & #pragma pack(pop)

1 引子 在程序中,有的时候我们定义结构体的时候,要用#pragma pack(push,1) & #pragma pack(pop)类似代码将结构体包起来. 一般形式如下: #pragma pack(push,1): struct A { } : #pragma pack(pop): 这么做有什么目的呢? 注:下列内容来自网络. 2 #pragma pack简介 #pragma pack是指定数据在内存中的对齐方式, 在 C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如in

#pragma pack(n) 的宏实现

老样子,上代码,上公式 #ifndef ALIGNED #define ALIGNED(T, A, B) (((A) + (B) - 1) & (~((T)(B) - 1))) #endif 在VC 平台上 我们会这样让内存对其 #pragma pack(n) /* n = 1, 2, 4, 8, 16 */ 如果我们写这样一个程序,该如何实现呢? 这里先上一个例子:例如 7, 以4 对齐, 我们知道对齐后的大小是比7大的4的最小的整数倍. 4的二进制是0100, 减一取反 ~(0100-000

#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()

我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? 此时,#pragma pack(push) 和#pragma pack(pop) 以及#pragma pack()应运而生. 看测试代码:(说明,64位GCC,默认8字节对齐) 屏蔽了的代码选别看,只看这个结构体,在默认8字节对齐的方式下,sizeof大小为24个字节,这不再做分析,之前随笔分析过了. 然

warning: malformed '#pragma pack(pop[, id])' - ignored

关于这个警告信息,就是说忽略了我定义的结构体对齐信息,那么他就会按照默认的对齐来了.运行结果自然也是有错误的. 经过测试对比,发现是gcc版本问题,我的ubuntu中,gcc版本为4.4.1,还算比较新的.而交叉编译工具链中arm-linux-gcc中的gcc版本为3.4.5,比较老了. 查找了一些资料,发现使用 _attribute_((packed)) 可以解决这个问题,_attribute_((packed)) 的作用是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,

#pragma pack(非常有用的字节对齐用法说明)

#pragma pack(4)   //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐 typedef struct { char buf[3]; word a; }kk; #pragma pack()    //取消自定义字节对齐方式 对齐的原则是min(sizeof(word ),4)=2,因此是2字节对齐,而不是我们认为的4字节对齐. 这里有三点很重要:1.每个成员分别按自己的方式对齐,并能最小化长度2.复杂类型(如结构)的默认对齐方式是它最长

warning malformed '#pragma pack(push[, id], n)' - ignored

bmp.c:8: warning: malformed '#pragma pack(push[, id], <n>)' - ignored bmp.c:33: warning: #pragma pack (pop) encountered without matching #pragma pack (push, <n>) 这个警告很重要不能忽略,我遇到的这个问题适用于编译器比较老的,因为韦东山自带的虚拟机Ubuntu9.10用的是/work/tools/gcc- 3.4.5 -gl

C/C++中的内存对齐问题和pragma pack命令详解

这个内存对齐问题,居然影响到了sizeof(struct)的结果值.突然想到了之前写的一个API库里,有个API是向后台服务程序发送socket请求.其中的socket数据包是一个结构体.在发送socket之前,会检测数据的长度:服务端接收到数据后也会检测长度.如果说内存对齐问题影响到了结构体的sizeof,那么socket发送结构体的时候,是怎么发送的?发送的内容中是否包含结构体中的“空洞”?如果API库中的对齐方式没有设定,那么服务端和客户端的sizeof结果将不同,这会引起很多问题吗? 下

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

这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对齐.#pragma pack ()               作用:取消自定义字节对齐方式. #pragma  pack (push,1)     作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐 #pragma pack(pop)            作用:恢复对齐状态 因