c-有没有办法强制结构从缓存线开始



我有一些大的结构(>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);,其中对于一个结构,sizesizeof *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;
}

最新更新