我有一些大的结构(>64字节(,我能确保每个结构都从一个单独的缓存行开始吗?或者有办法强制执行吗?
C标准提供_Alignof (constant-expression)
来请求额外的对齐。对于一个结构,将其应用于第一个元素:
struct MyTag
{
_Alignas(64) char x[10];
};
#include <stdio.h>
int main(void)
{
printf("%zun", _Alignof (struct MyTag)); // Prints 64.
}
这需要将缓存行大小作为编译时常数。
编译器不需要支持扩展对齐,但会诊断请求的对齐是否过大。
如果编译器接受,这将为编译器分配的对象提供所请求的对齐。然而,malloc
可能返回没有所需对齐的地址。为此,请使用struct MyTag *p = aligned_alloc(64,size);
,其中对于一个结构,size
是sizeof *p
,对于N
结构,使用N* sizeof *p
。
假设gcc,您可以使用属性。
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html"您可以显式指定希望编译器用于给定结构或联合类型的对齐方式(以字节为单位(。或者,您可以省略对齐因子,只要求编译器将类型对齐到您正在编译的目标机器的最大有用对齐">
struct test {
int a;
double b;
void *n;
char p[59];
};
struct test_64 {
int a;
double b;
void *n;
char p[59];
} __attribute__ ((aligned (64)));
int main(void) {
struct test test_var __attribute__ ((aligned (64)));
struct test test_var_simple_align __attribute__ ((aligned));
printf ("sizeof (test):%ld ", sizeof(struct test));
printf ("__alignof__(test):%ldn", __alignof__(struct test));
printf ("sizeof (test_64):%ld ", sizeof(struct test_64));
printf ("__alignof__(test_64):%ldn", __alignof__(struct test_64));
printf ("sizeof (test_var):%ld ", sizeof(test_var));
printf ("__alignof__(test_var):%ldn", __alignof__(test_var));
printf ("sizeof (test_var_simple_align):%ld ", sizeof(test_var_simple_align));
printf ("__alignof__(test_var_simple_align):%ldn", __alignof__(test_var_simple_align));
return 0;
}