оптимизация размера структуры - PullRequest
2 голосов
/ 20 декабря 2009

У меня есть структура, которую я хотел бы оптимизировать.

typedef struct dbentry_s {
   struct dbentry_s* t_next;
   struct dbentry_s* a_next;
   char *t;
   char *a;
   unsigned char feild_m;
   unsigned char feild_s;
   unsigned char feild_other;
} dbentry;

Насколько я понимаю, компилятор создает структуры в памяти по мере их определения. Поэтому более крупные типы должны быть объявлены первыми, чтобы мелкие типы могли заполнить отверстия выравнивания.

Я прочитал статью WikiPedia о выравнивании структуры данных и другие статьи по этой проблеме. http://en.wikipedia.org/wiki/Data_structure_alignment

Но я все еще не уверен, является ли мой текущий порядок наиболее оптимальным или я что-то упустил?

Примечание: мой компилятор не поддерживает "#pragma pack"

Ответы [ 2 ]

5 голосов
/ 20 декабря 2009

Нет, это должен быть самый оптимальный порядок, основанный на обычном поведении компилятора (учитывая, что стандарт на самом деле не предписывает, как структуры упакованы относительно промежутков между элементами, хотя он гарантирует, что порядок указано: см. «6.2.5 Типы» последней версии C1x-n1425).

У вас есть все ваши указатели спереди и все ваши символы спереди, так что вы, вероятно, обнаружите, что с четырехбайтовым размером указателя вы получите 19- или 20-байтную структуру.

Вы можете легко проверить это, вставив в код следующие строки:

printf ("Size of dbentry* is %d\n", sizeof (struct dbentry_s*));
printf ("Size of char*    is %d\n", sizeof (char*));
printf ("Size of uns char is %d\n", sizeof (unsigned char));
printf ("Size of stucture is %d\n", sizeof (dbentry));

Причина, по которой я вставил все чеки sizeof, состоит в том, чтобы убедиться, что у вас есть полная информация. Я хорошо знаю, что sizeof(char) всегда равен 1.

1 голос
/ 20 декабря 2009

Вас может заинтересовать использование pahole и / или Cruncher # . Оба являются инструментами, которые анализируют расположение структур в памяти.

Ссылка: оригинал Сообщение в блоге Maciej Sinilo о Cruncher #.

...