Подтвердить что ты не робот

Аргумент функции C, соображения выравнивания памяти

При определении структур на C существуют соображения относительно заполнения, если размер структуры является предметом озабоченности, ее общая для переопределения значений, чтобы избежать заполнения. (см. Отметка и упаковка структуры)

Мои вопросы:

Применяют ли те же (или подобные) правила к аргументам функции? ... есть ли преимущество в организации аргументов, чтобы избежать байтов заполнения аргументов?


  • Предполагая, что это не inline (где это не имеет значения) или функция static, где компилятор может перенастроить аргументы.

  • Принимая, что измеримое улучшение реального мира, вероятно, будет небольшим.

... на практике, если проблема с вызовом функции вызывает беспокойство, возможно, стоит добавить функцию. тем не менее, inlining не всегда является опцией (например, библиотеки или указатели на функции).

4b9b3361

Ответ 1

Если аргумент достаточно мал для передачи в регистр, размер не имеет значения.

Как правило, ответ отрицательный, поскольку компиляторы часто расширяют аргументы, когда они передаются в стек для функции. Например:

  • Windows Visual С++ расширяется до 32 бит на платформах x86. (ссылка)
  • В Mac OS X конвекция вызова IA-32 должна расширяться до 4 байта, а на x86-64 соглашение о вызове - увеличьте до 8 байт.
  • В соответствии с этим соглашение о вызове Linux x86-64 совпадает с Mac OS X.
  • стандарт ARM указывает расширение до 4 байтов.

Таким образом, он не платит, чтобы группировать ваши один и два байтовых аргумента вместе, потому что либо аргумент будет передан в регистр, либо компилятор, вероятно, будет рассматривать их как четыре или восемь байтов в любом случае.

Ответ 2

Как аргументы передаются функции от архитектуры до архитектуры, поэтому невозможно дать какой-либо определенный ответ. Однако для большинства современных архитектур первые несколько параметров передаются в регистрах, а не в стеке, и мало важно, как параметры выравниваются, поскольку узкие аргументы не мультиплексируются в один регистр.