署名付き関数の場合:
struct Pair { void *v1, *v2 };
void f(Pair p);
Pair
x64 でコンパイルした場合、関数が次のように、 のフィールドをレジスタ経由で渡したいと思います。
void f(void *v1, void *v2);
OSX 10.6 で x86_64 用の gcc 4.2.1 を使用してテストをコンパイルすると、逆アセンブリを調べると、これがまさに何が起こるかがわかります。ただし、Windows で x64 用の MSVC 2008 を使用してコンパイルすると、逆アセンブリPair
により、スタックに渡されたことが示されます。プラットフォーム ABI がこの最適化を妨げる可能性があることを理解しています。これを機能させることができる MSVC 固有の注釈、呼び出し規約、フラグ、またはその他のハックを知っている人はいますか?
ありがとうございました!