结构对齐

Mar*_*ark 4 c

#define MAX_SIZE 8

enum my_enum
{
    VAL1 = 0;
    VAL2,
    VAL3,
    VAL4,
    VAL_MAX
};

struct my_struct
{
  enum my_enum e;
  int  w[MAX_SIZE];
};
Run Code Online (Sandbox Code Playgroud)

这种结构中的布局是否会导致目标平台上的对齐问题?我理解它很大程度上取决于一个平台,但通常允许C编译器对结构进行填充,例如在32位机器上,其中'int'是32位长:

struct my_struct
{
    int w[MAX_SIZE];
}
Run Code Online (Sandbox Code Playgroud)

是对齐的(就像我所理解的那样)因此编译器可能不会对其布局做任何其他事情,但在结构中添加"enum my_enum"可以在这样的机器上无法对齐地获得结构.我应该做些什么来避免这种情况吗?我应该完全避免它吗?

非常感谢澄清!

标记

Mys*_*ial 6

答案是否定的,你不需要做任何事情.如果添加字段将中断对齐,则编译器将在适当的位置应用填充以重新对齐它.

在你的情况下,enums很可能被实现为,int所以你不会首先遇到这个问题.

一个更好的例子是:

struct my_struct
{
  char ch;
  int  w[MAX_SIZE];
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,编译器可能会在之后放置3个字节的填充ch以保持w与4个字节对齐.