Представление (функции) указателей зависит от реализации. Реализация обычно будет (для линейного адресного пространства) использовать нечто, похожее на один из более длинных целочисленных типов;но это не является обязательным требованием: указатель может иметь длину 3, 4 или 5 байт, и в вашей архитектуре он, вероятно, будет ;-). (nm делает правильное замечание, что они также могут иметь размер 1 байт, ограничивая, я полагаю, количество функций до 2 ^ 21-1; это на самом деле также является хорошим предположением для реализации, которую вы описываете.)
Требования выравнивания - или рекомендации (чтобы избежать медленных нагрузок) - зависят от архитектуры и реализации. Выравнивание данных обменивает пространство для более высокой скорости: выровненные данные могут быть записаны и прочитаны быстрее, но выравнивание требует заполнения.
Компиляторы часто предлагают средства для обмена скоростью для повышения эффективности использования пространства, например #pragma pack
. Точные изменения в компоновке для упакованной структуры, как и способы ее достижения, зависят от реализации;но при отсутствии противоречивой информации я бы предположил, что в упакованной структуре нет заполнения. (Вы можете и должны доказать это в своей программе, проверив sizeof(struct s)
). Причина, по которой вы не ожидаете дополнения в упакованной структуре, заключается в том, что он используется для сопоставления его с аппаратным интерфейсом предопределенного макета.
Для определенного ответа без запуска программы нам нужны соответствующие части документации компилятора. так что мы знаем размер указателей на функции и эффект упаковки.