Это происходит от http://minirighi.sourceforge.net/html/kmalloc_8c.html
void * kmemalign (size_t alignment, size_t size)
Allocate some memory aligned to a boundary.
Parameters:
alignment The boundary.
size The size you want to allocate.
Exceptions:
NULL Out-of-memory.
Returns:
A pointer to a memory area aligned to the boundary. The pointer is a aligned_mem_block_t pointer, so if you want to access to the data area of this pointer you must specify the p->start filed.
Note:
Use kfree(void *ptr) to free the allocated block.
Лучший способ дополнить поля в структуре - объявить переменные по убыванию. Итак, сначала самые большие, потом самые маленькие.
struct example {
double amount;
char *name;
int cnt;
char is_valid;
};
Это не всегда приводит к логически связанным элементам в структуре, но обычно дает наиболее компактное и легкодоступное использование памяти.
Вы можете использовать байты заполнения в своих объявлениях структуры, но они загромождают код и не гарантируют компактные структуры. Компилятор может выровнять каждый байт на 4-байтовой границе, так что вы можете получить
struct example2 {
char a;
char padding1[3];
char b;
char padding2[3];
};
принимает 4 байта для a, 4 байта для заполнения1, 4 байта для b и 4 байта для заполнения2. Некоторые компиляторы позволяют вам указывать упакованные структуры, которые в этом случае будут давать правильный результат. Обычно я просто объявляю поля от самых больших до самых маленьких типов и оставляю это на этом. Если вам нужно разделить память между двумя языками / компиляторами, то вам нужно убедиться, что структуры одинаково выравниваются в памяти.