我已经写了一段代码,使用#杂注指令来对齐,但是我不能理解对齐是如何发生的。我在ubuntu上用的是gcc。
#include<stdio.h>
#define MALE 0;
#define FEMALE 1;
#define SINGLE 0;
#define MARRIED 1;
#pragma pack(3);
int main()
{
struct emp
{
unsigned gender :1;
unsigned mar:1;
unsigned hobby:1;
unsigned scheme :1;
};
struct emp e;
e.gender=MALE;
e.mar=SINGLE;
e.hobby=1;
e.scheme=1;
printf("size of %d",sizeof(e));
return 0;
}当我使用#杂注包为1,大小为1,#杂注包为2,#杂注包为2,对于3,它是4。
你能告诉我发生了什么吗?如果我不用它,还有4个。
那么#pragma pack(1)和#pragma pack(2)有什么不同呢
发布于 2012-07-29 23:11:41
3不是#pragma pack指令的有效参数。
有效值包括1、2、4、8和16,例如根据this page。
发布于 2012-07-29 23:29:36
`#pragma指令是C标准指定的方法,用于向编译器提供超出语言本身所传达信息的附加信息。
#pragma pack指定结构、联合和类成员的包装对齐方式。
有效值为1、2、4、8和16。杆件的对齐将位于上述任何值的倍数或杆件大小的倍数的边界上,以较小的值为准。
另外,下面是来自here的一些关于结构打包的信息
什么是结构打包?
有时,在结构的成员中避免填充字节是强制性的。例如,读取ELF文件头或BMP或JPEG文件头的内容。我们需要定义一个类似于头部布局的结构,并对其进行映射。但是,在访问这些成员时应格外小心。通常,逐字节读取是避免未对齐异常的一种选择。性能将会受到影响。
大多数编译器都提供了非标准扩展来关闭缺省填充,如编译指示或命令行开关。有关更多详细信息,请参阅相应编译器的文档。
i want to know that when i write #pragma pack(1) it set first bits and atart second from next one what if i write #pragma(2) , whats the difference 为了回答这个问题,当您将#杂注设置为2时,如果驻留在结构中的数据少于2个字节,则它的对齐方式保持不变。但是,如果它超过2个字节(比方说一个4字节的整数),它将被拆分并在2字节边界对齐。
发布于 2012-07-29 23:58:53
#pragma pack(1)和#pragma pack(2)之间的区别在于,在第一种情况下,您可以说您的结构可以从任何地址开始。
使用#pragma pack(2)时,您说起始地址必须能被2整除(一个偶数地址)。编译器通过声明结构的大小为2来实现这一点(通过用一些未使用的空间填充它)。
如果创建一个emp数组,如emp a[10],则sizeof(emp)也是数组中每个元素之间的距离。这就是编译器将大小向上舍入到#pragma pack值的下一个倍数的原因。
https://stackoverflow.com/questions/11710304
复制相似问题