x86_64 の場合、関数やメンバーへのポインターは、メンバー関数へのポインターのサイズを超えないと安全に想定できます。GCC の場合sizeof(void*)
は 、clang の場合はsizeof(void*)*2
(前回チェックしたとき) になります。アラインメント要件は 16 バイトです。GCC を使用すると、__BIGGEST_ALIGNMENT__
事前定義されたマクロを利用できます。ただし、clang にはありません。私が提案できる唯一のことは、想定するのではなく、最大サイズを計算するコンパイル時の式を使用することです。
アップデート:
@David が指摘したように、多重および/または仮想継承の場合にメンバー関数呼び出しをディスパッチするには、8 バイトでは不十分な場合があります。したがってsizeof(void*)*2
、安全な側にとどまるために、両方の場合に適用されます。
最善の方法は、 を使用したコンパイル時の式のままsizeof
です。例えば:
struct Foo {
};
typedef void* (Foo::*pmf)();
typedef void* (*bar)();
constexpr auto max_func_pointer_size() -> decltype(sizeof(void*)) {
return sizeof(pmf) > sizeof(bar) ? sizeof(pmf) : sizeof(bar);
}
int main()
{
static_assert(max_func_pointer_size() == 16, "oops!?");
}