Необъяснимое выделение стека в собственном коде C, созданном для x64 под Visual Studio 2010 - PullRequest
4 голосов
/ 10 июля 2010

Я пытаюсь использовать CL 16.0 для x64 (VS 2010) для создания некоторого читаемого 64-битного кода ASM для примера, но CL настаивает на предварительном выделении тонны стекового пространства (28-байтовых) со следующей строкой:

sub rsp, 40 ; 00000028H (actual value depends on number of local vars of course)

Вопрос, как я могу отключить это поведение?Это трудно объяснить классу, и мне нравится показывать им чистый, объяснимый код ... Я предполагаю, что "sub rsp, XXX" должен выделять точное пространство, требуемое локальными переменными в функции.

Конечно, это не нуждается в этом дополнительном пространстве.На x86 это поведение, кажется, управляется переключателями edit-and-continue (/ Zi vs. / ZI), но они не имеют никакого эффекта в случае x64.Любая идея, как заставить x64 CL выделять столько стека, сколько ему нужно?

Заранее спасибо!

1 Ответ

1 голос
/ 10 июля 2010

Было бы проще, если бы вы показали исходный код, который произвел это, но 40 байтов не так много для 64-битной машины. Это всего пять long с или указателей. Другая вещь, которую следует принять во внимание, - выравнивание для локальных переменных - компилятор, вероятно, дополняет их для оптимального доступа.

Edit:

Хм, это действительно немного озадачивает. Выполнение этого через GCC не приводит к такому захвату стека. Я подозреваю, что это требование пролога для обработки исключений, специфичное для компилятора (вы видите какие-то странные метки до и после выделения стека в сгенерированном коде?).

Вот несколько ссылок MSDN, которые могут оказаться полезными:

У меня нет Windows-бокса для тестирования, но попробуйте /favor:??? и посмотрите, не устранит ли это немного повышение уровня оптимизации. В конце концов, это функция листьев.

Кроме того, форматирование комментариев на SO отстой, поместите код в сам вопрос.

...