C结构尺寸对齐(C struct size alignment)

2019-07-30 01:36发布

我希望有一个C结构的大小是多个的16个字节(16B / 32B / 48B / ..)。 不要紧,它得到其大小,它只需要将多个16B的。 我怎么能强制编译器这样做呢? 谢谢。

Answer 1:

C结构的大小将取决于结构的成员,他们的类型和多少人有。 实在是强制编译器进行结构是一些大小的倍数的标准方法。 有些编译器提供了编译,将允许您设置然而对齐边界那真是一个不同的事情。 而且可能有一些会具有这样的设置或者提供这样的编译。

但是,如果你坚持这样一个方法是做结构的内存分配和强制内存分配围捕到下一个16字节大小。

所以,如果你有这样一个结构。

struct _simpleStruct {
   int iValueA;
   int iValueB;
};

然后,你可以不喜欢以下。

{
    struct _simpleStruct *pStruct = 0;
    pStruct = malloc ((sizeof(*pStruct)/16 + 1)*16);
    // use the pStruct for whatever
    free(pStruct);
}

这是什么会做的是推动规模达下一个16字节大小,只要你时刻关注。 但是什么内存分配器确实可能会或可能不会给你一个块实际上是大小。 内存块实际上可能比你的要求更大。

如果你打算做一些特别的东西与此,比如让说,你会写这个结构到一个文件,你想知道块的大小,那么你必须做在的malloc使用同样的计算(),而比使用的sizeof()算子来计算结构的大小。

因此,接下来的事情将是使用宏,如写自己的sizeof()运算符。

#define SIZEOF16(x) ((sizeof(x)/16 + 1) * 16)

据我所知,从一个指针拉动分配的块的大小没有可靠的方法。 正常情况下,指针将具有所使用的,将含有各种存储器管理信息的存储器堆管理功能,例如,其实际上可能比所请求的内存量较大的所分配的块大小的存储器分配块。 但是此块和它的位置相对于提供将取决于C编译器的运行时间的实际内存地址的格式。



Answer 2:

对于Microsoft Visual C ++:

#pragma pack(push, 16)

struct _some_struct
{
     ...
}

#pragma pack(pop)

对于GCC:

struct _some_struct { ... } __attribute__ ((aligned (16)));

例:

#include <stdio.h>

struct test_t {
    int x;
    int y;
} __attribute__((aligned(16)));

int main()
{
    printf("%lu\n", sizeof(struct test_t));
    return 0;
}

编译gcc -o main main.c将输出16 。 这同样适用于其他编译器。



Answer 3:

这完全取决于编译器和其他工具,因为没有指定对准的是,深深的ISO C标准(它指定对齐可以在编译器授意下进行,但不会进入细节就如何执行它)。

你需要考虑的具体实施,工具和你的编译器。 它可提供#pragma pack (或align或一些其他的东西),你可以添加到您的结构defininition。

它也可以提供这作为语言的扩展。 例如,海湾合作委员会允许你添加属性的定义,其中一个控制对齐方式:

struct mystruct { int val[7]; } __attribute__ ((aligned (16)));


Answer 4:

也许你可以做一个双重结构,在第二个,可以添加填充包装您的实际结构:

struct payload {
  int a;    /*Your actual fields. */
  float b;
  char c;
  double d;
};

struct payload_padded {
  struct payload p;
  char   padding[16 * ((sizeof (struct payload) + 15) / 16)];
};

然后,你可以加衬结构的工作:

struct payload_padded a;

a.p.d = 43.3;

当然,你可以利用这一结构的第一个成员开始从结构开始,其中0字节的事实,并把一个指向struct payload_padded ,仿佛这是一个指向struct payload (因为它):

float d_plus_2(const struct payload *p)
{
  return p->d + 2;
}

/* ... */

struct payload_padded b;
const double dp2 = d_plus_2((struct payload *) &b);


文章来源: C struct size alignment