__fastcall соглашение в c # - PullRequest
       14

__fastcall соглашение в c #

4 голосов
/ 07 февраля 2011

Учитывая, что:

Специфично для Microsoft

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

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

Ответы [ 3 ]

5 голосов
/ 07 февраля 2011

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

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

4 голосов
/ 07 февраля 2011

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

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

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

Источник

0 голосов
/ 28 февраля 2011

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

...