Я хотел бы подсчитать / суммировать накладные расходы в объектном файле из-за упаковки (и, в идеале, gcc минимизировать это для меня).
Например, рассмотрим следующую структуру (32-битная)x86, gcc):
struct a {
uint8_t a_char;
uint32_t an_integer
uint8_t another_letter;
};
В то время как фактические данные занимают всего 6 байтов, структура занимает 12 байтов в памяти, потому что после обоих символов следуют 3 байта заполнения.Переупорядочив структуру следующим образом:
struct b {
uint32_t an_integer
uint8_t a_char;
uint8_t another_letter;
};
Структура будет иметь только sizeof (struct b) == 8 (все еще 4 байта служебных данных).
(1) В идеале, I 'Мне бы хотелось, чтобы gcc переставил struct a
в struct b
и сэкономил мне место, но моя версия (4.2), похоже, не делает этого ни для какого уровня оптимизации.
(2) В качестве альтернативы, учитывая struct a
, я бы хотел (автоматически) получить либо число 6
(общая сумма накладных расходов), либо 4
(минимальная сумма накладных расходов, если члены упорядочены «в идеале»).Цель этого состоит в том, чтобы определить, стоит ли переупорядочение структур вручную времени (вероятно, нет).
Есть ли способ для gcc сделать (1), и есть ли инструмент, который будет работать (2)?Наиболее близкая вещь, которую я могу придумать для (1), это #pragma pack(1)
, но (я предполагаю) это будет иметь серьезные последствия для производительности, поскольку большинство / все обращения к памяти будут выровнены.Что касается (2), я думаю, что Perl-скрипт, разбирающий символы отладки, мог бы сделать это, но я недостаточно знаком с DWARF, чтобы знать наверняка.