我使用#pragma指令编写了一个代码来对齐但我无法理解如何进行对齐。 我在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;
}
当我使用#pragma pack为1时,大小为1,#pragma pack为2,大小为2,而3为4。
你能告诉我发生了什么吗?如果我不使用它仍然4来。
那么#pragma pack(1)
和#pragma pack(2)
之间有什么区别?
答案 0 :(得分:2)
3
不是#pragma pack
指令的有效参数。
有效值为1
,2
,4
,8
和16
,例如this page。
答案 1 :(得分:0)
`#pragma'指令是C标准指定的方法,用于向编译器提供附加信息,超出语言本身传达的内容。
#pragma
pack指定结构,联合和类成员的打包对齐方式。
有效值为1,2,4,8和16.成员的对齐将位于边界上,该边界是上述任何值的倍数或成员大小的倍数,以较小者为准更小
此外,有关here
下方结构包装的一些信息什么是结构包装?
有时,必须避免在结构成员之间填充字节。例如,读取ELF文件头或BMP或JPEG文件头的内容。我们需要定义一个类似于标题布局的结构并映射它。但是,在访问这些成员时应该小心。通常逐字节读取是避免错位异常的选项。表现会受到打击。
大多数编译器提供非标准扩展来关闭默认填充,如pragma或命令行开关。有关更多详细信息,请参阅相应编译器的文档。
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
要回答这个问题,当您将#pragma设置为2时,如果驻留在结构中的数据少于2个字节,则它的对齐方式保持不变。但是,如果它超过2个字节(比如4个字节的整数),它将被拆分并以2个字节的边界对齐。
答案 2 :(得分:0)
#pragma pack(1)
和#pragma pack(2)
之间的区别在于,在第一种情况下,您说您的结构可以从任何地址开始。
使用#pragma pack(2)
,您说起始地址必须可被2整除(偶数地址)。编译器通过这样做来说明结构的大小为2(通过用一些未使用的空格填充它)。
如果您创建一个emp
数组,如emp a[10]
,则sizeof(emp)
也是数组中每个元素之间的距离。这就是编译器将大小四舍五入到#pragma pack
值的下一个倍数的原因。