首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用了c#中的#杂注包,但无法理解

使用了c#中的#杂注包,但无法理解
EN

Stack Overflow用户
提问于 2012-07-29 23:08:27
回答 3查看 986关注 0票数 2

我已经写了一段代码,使用#杂注指令来对齐,但是我不能理解对齐是如何发生的。我在ubuntu上用的是gcc。

代码语言:javascript
复制
#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)有什么不同呢

EN

回答 3

Stack Overflow用户

发布于 2012-07-29 23:11:41

3不是#pragma pack指令的有效参数。

有效值包括124816,例如根据this page

票数 3
EN

Stack Overflow用户

发布于 2012-07-29 23:29:36

`#pragma指令是C标准指定的方法,用于向编译器提供超出语言本身所传达信息的附加信息。

#pragma pack指定结构、联合和类成员的包装对齐方式。

有效值为1、2、4、8和16。杆件的对齐将位于上述任何值的倍数或杆件大小的倍数的边界上,以较小的值为准。

有关更多详细信息,请参阅MSDN pagehere

另外,下面是来自here的一些关于结构打包的信息

什么是结构打包?

有时,在结构的成员中避免填充字节是强制性的。例如,读取ELF文件头或BMP或JPEG文件头的内容。我们需要定义一个类似于头部布局的结构,并对其进行映射。但是,在访问这些成员时应格外小心。通常,逐字节读取是避免未对齐异常的一种选择。性能将会受到影响。

大多数编译器都提供了非标准扩展来关闭缺省填充,如编译指示或命令行开关。有关更多详细信息,请参阅相应编译器的文档。

代码语言:javascript
复制
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字节边界对齐。

票数 0
EN

Stack Overflow用户

发布于 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值的下一个倍数的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11710304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档