2014-02-06 3 views
1

Я хочу выровнять структуры данных в моем приложении с кешем строк. Вот простой сценарий:Структуры данных выравнивания кэша

typedef struct container { 
    int a; 
    int b; 
} cont __attribute__((aligned(64)); 

int main() { 
    cont *a; 
    a = malloc(sizeof(cont) * 10); 
    printf("%p", a); 
    return 0; 
} 

В этом случае я думал, что начальный адрес массива будет кэш выровнена, т.е. начинаются в 64 байтовой границе. Но печатаемый адрес - 0x9dd008, который не совпадает с границей 64 байта. Я что-то упустил в этой реализации?

+0

Если у вас остались вопросы, пожалуйста, дайте мне знать. Я был бы рад ответить. – Jason

ответ

1

Вы выписываете из кучи, а возвращаемый адрес определяется malloc(). Поскольку код уже скомпилирован, компилятор не может обеспечить требуемое выравнивание адреса.

Если вы попытаетесь выделить cont в стек, вы должны увидеть правильное выравнивание.

1

Вы должны использовать posix_memalign() для выделения памяти с определенным выравниванием памяти. В C11 у вас также есть возможность использовать aligned_alloc(), что обеспечит ту же функциональность, что и posix_memalign() на других платформах (помимо POSIX).

Смежные вопросы