曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 5442|回复: 0
打印 上一主题 下一主题

#pragma pack 与 __attribute__ ((packed))

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2011-11-16 19:57:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在默认情况下,数据一般都是以 4 字节对齐的(32 位机)。

同一个程序分别使用 VC 和 GCC 来编译都可以得到相同的结果:
[C++] 纯文本查看 复制代码
#include <stdio.h>

struct temp3 {
        char a1;
        int a2;
} C;
int main()
{
        printf ("%d\n", sizeof(C));

        return 0;
}


在两种编译器编译下,输出结果都是 8 。这是因为,访问内存的硬件电路,如果地址按照 4 字节对其那么访问效率就会高很多。所以,编译器会将 C 结构中的 char 型变量 a1 在扩充 3 个字节后,将整型变量 a2 对其到 4 字节倍数的地址上。

如果我们不希望编译器进行这种调整,那么针对于 VC 和 GCC 都有不同的伪指令使编译器采用上面的默认对齐。

在 VC 中使用 #pragma pack(n) 伪指令可以使数据按照 n 字节对齐。比如使用 #pragma pack(1) 伪指令使,数据将按照 1 字节对齐。比如如下声明结构体:
[C++] 纯文本查看 复制代码
#pragma pack(1)
struct temp3 {
    char a1;
        int a2;
}C;
#pragma pack()

那么在输出 sizeof(C) 时得到的值为 5 。上面最后一行 #pragma pack() 表示取消自定义的字节对齐方式。

在 GCC 中也有相似伪指令:__attribute__ ((packed)) 。比如我们将上面的结构体声明为:
[C++] 纯文本查看 复制代码
struct temp3 {
        char a1;
        int a2;
}__attribute__ ((packed)) C;

那么在输出 sizeof(C) 时结果也是为 5 。

上面取消默认对齐方式的做法,除非你觉得有必要,否则不要轻易做这种调整,因为这将降低程序的性能。目前比较常见的用法有两种:一是这个结构需要被直接写入文件;二是这个结构需要通过网络传送给其他程序。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-4-28 03:17 , Processed in 0.085753 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表