C struct padding

shi*_*ape 3 c

我可以在各种编译器上使用pragma pack来强制结构具有不在其自然对齐上的字段.

这是递归的 - 所以假设struct typedef A包含typedef struct B的字段.如果使用pragma打包A将强制结构B打包?

R..*_*R.. 5

只是不要.如果没有指定您正在使用的确切平台/编译器,您甚至可以询问有关丑陋的非标准扩展的确切行为.如果您发现自己需要打包结构,那么最好弄明白为什么代码被破坏并修复它.打包的结构是破坏代码的创可贴,无法解决破坏的根本原因.

  • @Nathon:使用二进制IO的结构被破坏了.`#pragma packed`不会修复字节序依赖等.编写正确的序列化函数.@ user384706:在除x86之外的任何系统上,读取和写入非对齐字段的额外代码量将远远大于结构中浪费的几个字节 - 特别是如果你修复元素的顺序以便它们自然正确对齐,没有填充要求.提示:`alignof(type)`为所有类型划分`sizeof(type)`. (3认同)
  • @R ......:为什么是破损代码的创可贴?封装结构用于存储器保护,尤其是在嵌入式系统中.所以你是什么意思? (2认同)
  • 有时他们是必要的.想要干净地表示其字段在C中不是全字对齐的数据包吗?您可以使用压缩结构或整个垃圾宏.也就是说,我已经看到了一些与递归打包结构相关的讨厌的编译器错误.不寒而栗. (2认同)
  • 有时需要使用压缩结构来处理内存映射的I/O设备. (2认同)

Cli*_*ord 5

你不得不希望!假设你有一个带参数struct A的函数:

void fn( struct A x ) ;
Run Code Online (Sandbox Code Playgroud)

然后是一个包含结构A作为成员的压缩结构B:

#pragma pack(1)
struct B
{
    struct A a ; 
}
Run Code Online (Sandbox Code Playgroud)

如果将B的成员a传递给fn(),则该函数不知道此实例中的打包,并且会失败.

尽管有其他回答者的结果,我在VC++ 2010上进行了以下测试:

struct A
{
    int a;
    char b;
    int c ;
} ;

struct B
{
    struct A  d ;
} ;

#pragma pack(1)
struct C
{
    struct A  d ;
} ;


#pragma pack(1)
struct D
{
    int a;
    char b;
    int c ;
} ;

#pragma pack(1)
struct E
{
    struct D ;
} ;

int main()
{
    int a = sizeof(struct A) ;
    int b = sizeof(struct B) ;
    int c = sizeof(struct C) ;
    int d = sizeof(struct D) ;
    int e = sizeof(struct E) ;
}
Run Code Online (Sandbox Code Playgroud)

检查调试器中main()中的a,b,c,d和e产量:

  • a = 12
  • b = 12
  • c = 12
  • d = 9
  • e = 9

包装struct C对其struct A成员的大小没有影响.