Вопросы с тегом «calling-convention»

151
Что такое __stdcall?

Я изучаю программирование на Win32, и его WinMainпрототип выглядит так: int WINAPI WinMain ( HINSTANCE instance, HINSTANCE prev_instance, PSTR cmd_line, int cmd_show ) Я был смущен относительно того, для чего был этот WINAPIидентификатор, и нашел: #define WINAPI __stdcall Что это делает? Я смущен...

110
Почему Windows64 использует другое соглашение о вызовах, чем все другие операционные системы на x86-64?

У AMD есть спецификация ABI, в которой описывается соглашение о вызовах для использования на x86-64. Все операционные системы следуют ему, за исключением Windows, которая имеет собственное соглашение о вызовах x86-64. Зачем? Кто-нибудь знает технические, исторические или политические причины этой...

103
Как именно работает стек вызовов?

Я пытаюсь глубже понять, как работают низкоуровневые операции языков программирования и особенно как они взаимодействуют с ОС / ЦП. Я, наверное, читал все ответы в каждой теме, связанной со стеком / кучей, здесь, на Stack Overflow, и все они великолепны. Но есть еще одна вещь, которую я еще не...

85
Почему T * может быть передано в регистр, а unique_ptr <T> не может?

Я смотрю выступление Чендлера Каррута в CppCon 2019: Нет абстракций с нулевой стоимостью в нем он приводит пример того, как он был удивлен тем, сколько накладных расходов вы понесли, используя std::unique_ptr<int>овер int*; этот сегмент начинается примерно в момент времени 17:25. Вы можете...

84
__cdecl или __stdcall в Windows?

В настоящее время я разрабатываю библиотеку C ++ для Windows, которая будет распространяться как DLL. Моя цель - максимизировать бинарную совместимость; точнее, функции в моей DLL должны использоваться из кода, скомпилированного с несколькими версиями MSVC ++ и MinGW, без необходимости...

14
Почему стековая память выделяется, когда она не используется?

Рассмотрим следующий пример: struct vector { int size() const; bool empty() const; }; bool vector::empty() const { return size() == 0; } Сгенерированный код сборки для vector::empty(по clang, с оптимизацией): push rax call vector::size() const test eax, eax sete al pop rcx ret Почему он выделяет...