Сколько памяти требуется для структуры, содержащей массив указателей на функции? - PullRequest
1 голос
/ 24 октября 2019

У меня есть структура, написанная для гипотетического ЦП:

struct s {
  int m;
  void (*foo[13])(int);
  char s;

};

Если адресное пространство имеет ширину 63 бита, и если один байт составляет 21 бит (символ 21 бит), short, int и longДлина 42 бита и длина 168 бит, я могу поместить указатели в тип long long, потому что они не могут поместиться в char, short, int или long? Нужно ли длинное 13 * (168 бит) для хранения 13 функциональных указателей?

1 Ответ

0 голосов
/ 24 октября 2019

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

Требования выравнивания - или рекомендации (чтобы избежать медленных нагрузок) - зависят от архитектуры и реализации. Выравнивание данных обменивает пространство для более высокой скорости: выровненные данные могут быть записаны и прочитаны быстрее, но выравнивание требует заполнения.

Компиляторы часто предлагают средства для обмена скоростью для повышения эффективности использования пространства, например #pragma pack. Точные изменения в компоновке для упакованной структуры, как и способы ее достижения, зависят от реализации;но при отсутствии противоречивой информации я бы предположил, что в упакованной структуре нет заполнения. (Вы можете и должны доказать это в своей программе, проверив sizeof(struct s)). Причина, по которой вы не ожидаете дополнения в упакованной структуре, заключается в том, что он используется для сопоставления его с аппаратным интерфейсом предопределенного макета.

Для определенного ответа без запуска программы нам нужны соответствующие части документации компилятора. так что мы знаем размер указателей на функции и эффект упаковки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...