Я знаю, что я немного опоздал на вечеринку по этому поводу, но если кто-то из вас наткнулся на это, просто помните, что вы можете определить макрос, чтобы имитировать его. Например:
#if defined(__GNUC__)
#define MSFASTCALL __fastcall
#define GCCFASTCALL
#elif defined(_MSC_VER)
#define MSFASTCALL
#define GCCFASTCALL __attribute__((fastcall))
#endif
int MSFASTCALL magic() GCCFASTCALL;
Очевидно, это выглядит некрасиво, так что вы можете просто определить 2 прототипа (что я и делаю), чтобы его было немного легче читать, но есть люди, которые предпочитают маршрут, который требует меньше ввода. Я обычно не использую соглашения о вызовах, за исключением особых случаев. Я просто позволил компилятору оптимизировать все остальное.
Теперь нужно запомнить некоторые причуды. Например, когда вы ориентируетесь на 64-битные платформы, все функции используют соглашение fastcall для того, чтобы воспользоваться дополнительными регистрами и повысить скорость и снизить стоимость косвенного обращения. Кроме того, fastcall по-разному реализован на разных платформах, поскольку он не стандартизирован. Есть и другие, но это все, что я могу снять с головы.