我正在写一个更简单(更快)的std / boost :: function等价物。我主要关注的是简单性和效率,平台仅限于x86-64 linux,用gcc和clang编译。
根据上述限制,假设
是公平的答案 0 :(得分:1)
对于x86_64,您可以安全地假设任何指向函数和/或成员的指针都不会超过指向成员函数的指针的大小。对于GCC,这将是sizeof(void*)
,对于clang,这将是sizeof(void*)*2
(我上次检查时)。对齐要求是16个字节。使用GCC,您可以依赖__BIGGEST_ALIGNMENT__
预定义的宏。然而,它没有铿锵声。我唯一可以建议的是尽量不要假设,但使用计算最大尺寸的编译时表达式。
<强>更新强>
正如@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!?");
}