首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我是不是误解了<> __attribute__ </>这个<> ((packed)) </>在<>__attribute__</><>((Packed))</>。

我是不是误解了<> __attribute__ </>这个<> ((packed)) </>在<>__attribute__</><>((Packed))</>。
EN

Stack Overflow用户
提问于 2015-01-08 19:40:44
回答 2查看 1.2K关注 0票数 2

我正在尝试下面的方法,在win32上和gcc一起。

代码语言:javascript
复制
#include <stdio.h>

struct st { char c; int x; } __attribute__ ((packed));

int main() {
    printf("%d\n", sizeof(struct st));
    return 0;
}

我希望打印值是5,但实际上是8。

然而,对于下面的代码,我得到了5。

代码语言:javascript
复制
#include <stdio.h>

#pragma pack(1)
struct st { char c; int x; };

int main() {
    printf("%d\n", sizeof(struct st));
    return 0;
}

我的程序肯定出了什么问题,但我看不出是什么问题。我已经阅读了gcc's manual和几个关于这方面的问题,但我仍然感到困惑。有什么提示吗?

另外,从SO上对这些问题的回答中,我了解到我不应该在marshalling中使用压缩结构,我可能不会经常使用它,但我仍然希望了解我在这么短的程序中看不到什么。

注意: gcc-4.9.2和gcc-4.8.4都出现了这个问题。

EN

回答 2

Stack Overflow用户

发布于 2015-01-08 19:54:09

您将属性放在了错误的位置-请尝试以下操作:

代码语言:javascript
复制
struct st { char c;
            int x __attribute__ ((packed));
          };

根据gcc手册中的示例,这将导致x被打包为紧跟在c之后。

当然,从一开始你就不应该这样做,因为你的代码会在某些架构上崩溃,即使在它没有崩溃的地方,也可能会有性能损失。

票数 2
EN

Stack Overflow用户

发布于 2015-01-09 17:25:44

在我的环境下,Centos 5.11 (64位)在你提到的第一种情况下打印5。

gcc 4.9.1版(GCC)

gcc文件.c

代码语言:javascript
复制
./a.out 

5

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

https://stackoverflow.com/questions/27839287

复制
相关文章

相似问题

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