2011-02-06 8 views
4

Учитывая, что:__fastcall конвенции в C#

Microsoft Specific

__fastcall соглашение о вызове указывает, что аргументы функций должны быть переданы в регистрах, когда возможно. В следующем списке показана реализация этого соглашения .

И что время чтения/записи в регистре происходит быстрее, чем в стеке, есть ли у нас какой-либо эквивалент __fastcall в C#?

+2

FYI: [Быстрое ускорение?] (Http://stackoverflow.com/questions/2188680/is-fastcall-really-faster) – Oystein

ответ

5

Не напрямую, C# в основном использует то, что было бы эквивалентно __stdcall конвенции MSVC++ s. Однако он может быть «исправлен», хотя в relatively dirty way (обратите внимание, что пример для __cdecl).

Возможно, это лучший вариант. На высокоуровневом языке, таком как C# (черт, даже в большинстве программ на C++), это оптимизация, наиболее подходящая для компилятора. Соглашение о принудительном вызове часто может make things worse. И даже когда это помогает, оно обычно не покупает вас много, по крайней мере, в программах на C и C++, где я их использовал.

+0

+1 за подробное объяснение link – Edward

+0

да, эта ссылка отличная/очень полезная – Hardryv

4

__fastcall используется автоматически, но только в определенных условиях. Вот интересная статья об этой теме:

2. В методе должно быть не более семи параметров.

Причиной этого является то, что в .net первые два параметра быстрее , чем последние два parameters.Let мне объяснить это более ясно. В C# при вызове метода параметры вставляются в стек, , которые затем используются способом. Теперь Компиляторы Microsoft (в X86) имеют усовершенствованную технику оптимизации __FASTCALL, в которой первые два параметра отправляются через регистры . Говорят, что теперь у них есть . После регистрации переменная или имеет ускоренную раскрутку с исключительной привилегией быть , хранящейся в самом быстром кеш процессора. Обратите внимание, что это обычно делается для переменной «i», которую мы используем во время цикла или итерации, из-за которой ее доступ и использование становятся действительно быстрыми. Таким образом, во время компиляции метод компилируется в машинный код в .Net выполнения с __fastcall действия так метод с меньшим количеством параметров гораздо более эффективен, чем , что слишком много параметров.

Source

+0

Отличное объяснение Lada. Позвольте мне добавить одну точку: «метод с меньшим количеством параметров намного оптимизирован, чем при слишком большом числе». Есть ли ограничение на тип параметров? Я имею в виду, он работает только с типами значений? Учитывая, что ссылочные типы хранятся в стеке. Или есть ли вероятность, что мы можем отправить экземпляр класса в регистр? (Извините за редактирование, ошибочно) – Edward

+0

Типы ссылок хранятся в куче (но их адреса памяти находятся в стеке). Передача ссылочного типа функции в основном означает передачу его адреса памяти, это как передача указателя на функцию C++, и это всего лишь 32 или 64-битное целое (в зависимости от платформы), поэтому нет никаких ограничений. – Dalmas

+1

Ну, я думаю, что есть одно ограничение, если вы передаете огромное значение типа функции, оно слишком велико для хранения в регистре ... но я не знаю достаточно, чтобы рассказать вам больше о том, как компилятор занимается этим. – Dalmas

0

LadaRaider, 32-bit Arch, что означает, что «Максимальный размер самых больших регистров составляет 4 байта», если u передает «Long Long», который принимает 8 байтов, он будет использовать 2 регистра 4 байта, вот как компилятор работает с этим. Предположим, вам нужно использовать только 3 регистра 4 байта, поэтому вы не можете передавать 2 «Long Long» переменных, например ... Некоторым данным придется переходить в память, которая намного медленнее.

Смежные вопросы