我希望C结构体的大小是16字节的倍数(16B/32B/48B/..)。无论最终大小是多少,它只需要是16字节的倍数。
如何让编译器实现这一点?
我希望C结构体的大小是16字节的倍数(16B/32B/48B/..)。无论最终大小是多少,它只需要是16字节的倍数。
如何让编译器实现这一点?
对于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
。其他编译器也一样。
#pragma pack
(或 align
或其他某些东西),您可以将其添加到结构定义中。struct mystruct { int val[7]; } __attribute__ ((aligned (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)
#define SIZEOF16(x) ((sizeof(x) & 0x0F) ? (sizeof(x) + (0x10 - (sizeof(x) & 0x0F))) : sizeof(x))
- rsethcx++
,而且通常所有大写字母的函数看起来都像是宏,所以我想这可能是相当无害的。我想一个 inline
函数也可以做到。 - Richard Chamberssizeof
在编译时就已经确定了。我无法想象它会像这样被使用:SIZEOF16 = (x++)
,但如果真的这样使用,我认为可能有一些方法告诉 GCC 只评估一次宏参数(我记不清了)。 - rsethcstruct 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;
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);