编译器如何使用pragma pack(1)实现填充,为什么不使用?

时间:2018-01-30 06:00:25

标签: c

我已经在gcc编译器中编写并执行了以下代码,它使用结构填充。 (虽然它不是类似的数据类型集)很好,但有些人建议不要使用pragma pack(1)为什么会这样?。

#include<stdio.h>
#pragma pack(1)
struct a
{
        char a;
        int b;
        char c;
        int d;
};

printf("Size of struct :%d\n",sizeof(b));
***output***
     with pragma pack(1) = 10
     without pragama pack(1) = 16

2 个答案:

答案 0 :(得分:5)

一个问题是对未对齐成员的访问速度较慢 - 使用对齐来确保快速访问。

当人们认为他们需要通过线路(网络连接)发送结构并且不想花时间序列化和反序列化他们的数据时,他们倾向于使用打包,并不总是意识到避免这种开销是成本的这可能与序列化/反序列化的成本相当。如果接收CPU是big-endian而发送端是little-endian,那么至少有一台计算机必须正确地完成工作。成本确实随平台而变化 - 与CISC芯片相比,RISC芯片对接入错位的要求更为严格。 (例如,在DEC Alpha上,未对齐的访问导致系统调用。)

答案 1 :(得分:0)

#pragma非后跟STDC会导致实现定义的行为。 #pragma pack(x)通常用于兼容英特尔架构的gcc或MSVC用户,但会导致不严格的程序。

当可移植性不是问题时,它是有意义的,但应该总是考虑两次:在可能的情况下始终优先采用严格一致的方式。