Аргумент функции C, соображения выравнивания памяти
При определении структур на C существуют соображения относительно заполнения, если размер структуры является предметом озабоченности, ее общая для переопределения значений, чтобы избежать заполнения. (см. Отметка и упаковка структуры)
Мои вопросы:
Применяют ли те же (или подобные) правила к аргументам функции?
... есть ли преимущество в организации аргументов, чтобы избежать байтов заполнения аргументов?
-
Предполагая, что это не inline
(где это не имеет значения) или функция static
, где компилятор может перенастроить аргументы.
-
Принимая, что измеримое улучшение реального мира, вероятно, будет небольшим.
... на практике, если проблема с вызовом функции вызывает беспокойство, возможно, стоит добавить функцию. тем не менее, inlining не всегда является опцией (например, библиотеки или указатели на функции).
Ответы
Ответ 1
Если аргумент достаточно мал для передачи в регистр, размер не имеет значения.
Как правило, ответ отрицательный, поскольку компиляторы часто расширяют аргументы, когда они передаются в стек для функции. Например:
- Windows Visual С++ расширяется до 32 бит на платформах x86. (ссылка)
- В Mac OS X конвекция вызова IA-32 должна расширяться до 4 байта, а на x86-64 соглашение о вызове - увеличьте до 8 байт.
- В соответствии с этим соглашение о вызове Linux x86-64 совпадает с Mac OS X.
- стандарт ARM указывает расширение до 4 байтов.
Таким образом, он не платит, чтобы группировать ваши один и два байтовых аргумента вместе, потому что либо аргумент будет передан в регистр, либо компилятор, вероятно, будет рассматривать их как четыре или восемь байтов в любом случае.
Ответ 2
Как аргументы передаются функции от архитектуры до архитектуры, поэтому невозможно дать какой-либо определенный ответ. Однако для большинства современных архитектур первые несколько параметров передаются в регистрах, а не в стеке, и мало важно, как параметры выравниваются, поскольку узкие аргументы не мультиплексируются в один регистр.