时间:2010-07-23 13:12:58

标签: c c-preprocessor pragma-pack

11 个答案:

答案 0 :(得分:362)

答案 1 :(得分:22)

答案 2 :(得分:15)

答案 3 :(得分:7)

答案 4 :(得分:2)

答案 5 :(得分:2)

答案 6 :(得分:1)

答案 7 :(得分:1)

答案 8 :(得分:1)

答案 9 :(得分:0)

请注意,还有其他方法可以实现#pragma pack提供的数据一致性(例如,有些人将#pragma pack(1)用于应该通过网络发送的结构)。例如,请参阅以下代码及其后续输出:

#include <stdio.h>

struct a {
    char one;
    char two[2];
    char eight[8];
    char four[4];
};

struct b { 
    char one;
    short two;
    long int eight;
    int four;
};

int main(int argc, char** argv) {
    struct a twoa[2] = {}; 
    struct b twob[2] = {}; 
    printf("sizeof(struct a): %i, sizeof(struct b): %i\n", sizeof(struct a), sizeof(struct b));
    printf("sizeof(twoa): %i, sizeof(twob): %i\n", sizeof(twoa), sizeof(twob));
}

输出如下: sizeof(struct a):15,sizeof(struct b):24 sizeof(twoa):30,sizeof(twob):48

注意struct a的大小与字节数的大小完全相同,但struct b添加了填充(有关填充的详细信息,请参阅this)。通过执行此操作而不是#pragma pack,您可以控制将“有线格式”转换为适当的类型。例如,“char two [2]”变为“short int”等等。

答案 10 :(得分:0)

为什么要使用它?

减少结构的内存

为什么不应该使用它?

  1. 这可能会导致性能下降,因为某些系统在对齐的数据上效果更好
  2. 某些机器将无法读取未对齐的数据
  3. 代码不可移植