Вызов методов, отличие от С++

При вызове функции все параметры и возвращаемые значения передаются через стэк. Параметры передаются в порядке слева-направо, т.е. первый аргумент функции будет первым элементов переданным в стэк. При вызове метода первым аргументом, передаваемый в стэк является адрес объекта.

Вызов метода производится инструкцией call, вызов виртуального метода callvirt.

После завершения исполнения функции, возвращаемое значение также помещается на вершину стэка.

Размер стэка с .NET приложениях определяется автоматически, функциональности по управлению размером стэка наподобие VC опции /STACK — нет.

Поскольку стэк это оперативная память, вызов метода приводит к записи/чтению данных из оперативной памяти. В случае отсутствия запрашиваемых данных в кэш-памяти процессора данные будут запрошены из оперативной памяти. Чтение данных из ОП примерно в 10-15 раз медленнее, чем чтение из кэш-памяти или регистра. Таким образом, программа на C# по определению будет работать медленнее программы на С++, где часть аргументов может передаваться через регистр процессора. Такова плата за кроссплатформенность.

Как показывает практика, перенос 32-х разрядного C++ кода под 64-х разрядную платформу даёт примерно 10-15% выигрыш в производительности. В архитектуре x86-64 программе доступно 16 регистров общего назначения, в два раза больше чем в x86-32. Следовательно, производительность вызова функции за счет передачи параметров через регистры может быть оптимизирована для большего количества функций в программе. Что и обеспечивает прирост производительности.