Я могу понять это требование для старых систем PPC RISC и даже для x86-64, но для старого проверенного x86? В этом случае стек необходимо выровнять только по 4-байтовым границам. Да, некоторые инструкции MMX / SSE требуют 16-байтового выравнивания, но если это требование вызываемого объекта, то оно должно гарантировать правильное выравнивание. Зачем обременять каждого вызывающего абонента этим дополнительным требованием? На самом деле это может вызвать некоторое снижение производительности, потому что каждый сайт вызова должен выполнять это требование. Я что-то упускаю?
Обновление. После дополнительного расследования этого и некоторых консультаций с некоторыми внутренними коллегами у меня появилось несколько теорий на этот счет:
- Согласованность между версиями ОС для PPC, x86 и x64
- Кажется, что кодогенератор GCC теперь последовательно выполняет sub esp, xxx, а затем перемещает данные в стек, а не просто выполняет инструкцию push. Это могло бы быть быстрее на некотором оборудовании.
- Хотя это немного усложняет сайты вызовов, при использовании соглашения cdecl по умолчанию, когда вызывающий объект очищает стек, возникает очень мало дополнительных накладных расходов.
Проблема, с которой я столкнулся с последним элементом, заключается в том, что для соглашений о вызовах, которые полагаются на вызываемый объект, очищающий стек, приведенные выше требования действительно искажают кодогенерацию. Например, какой компилятор решил реализовать более быстрый стиль вызова на основе регистров для собственного внутреннего использования (т.е. любой код, который не предназначен для вызова из других языков или источников)? Эта штука с выравниванием стека может свести на нет некоторые приросты производительности, достигнутые за счет передачи некоторых параметров в регистры.
Обновление. Пока что единственными реальными ответами была последовательность, но для меня это слишком простой ответ. У меня более 20 лет опыта работы с архитектурой x86, и если согласованность, а не производительность или что-то конкретное, действительно является причиной, то я с уважением полагаю, что разработчикам было бы немного наивно требовать этого. Они игнорируют почти три десятилетия инструментов и поддержки. Особенно, если они ожидают, что поставщики инструментов быстро и легко адаптируют свои инструменты для своей платформы (возможно, нет ... это это Apple ...) без необходимости перепрыгивать через несколько, казалось бы, ненужных обручей.
Я отдам эту тему еще на день или около того, а потом закрою ее ...