Использование упакованного в структуре также означает, что компилятор не может переупорядочить структуру данных, на некоторых платформах упаковка может привести к значительному снижению производительности. Некоторые процессоры не могут получить невыровненные слова, поэтому, если код будет скомпилирован на этой платформе, компилятор будет вынужден получать слово за байт и перемещать все в нужное место, это определенно то, что вам не нужно. Особенно в связанном списке, так как это сделает ваш список действительно очень медленным к доступу ... И даже если процессор поддерживает выравнивание, получение ЦП потребует дополнительных циклов для чтения из 2 адресов в памяти и повторного их объединения.
Вот почему вы должны посмотреть, как вы можете помочь компилятору. Вы бы хотели, чтобы структура выровнялась по словам, чтобы адрес следующего узла всегда можно было прочитать с помощью одной инструкции чтения. Это означало бы, что для 64-битной архитектуры вы бы хотели разместить указатель следующего узла сверху, чтобы он всегда был выровнен, затем вам нужно убедиться, что если вы используете структуры в массиве, адрес struct node *
будет всегда выравнивайте, поэтому вам нужно убедиться, что ваш окончательный размер структуры кратен 8 байтам. Это означает, что вы можете добавить еще 6 элементов или выбрать больший тип данных.
Это будет означать, что вы получите что-то вроде этого:
typedef struct __attribute__((packed)) node {
struct node *next;
char data[8];
} nodea;
typedef struct __attribute__((packed)) node {
struct node *next;
uint16_t data[4];
} nodea;
typedef struct __attribute__((packed)) node {
struct node *next;
uint32_t data[2];
} nodea;
и т.д.. и т. д.