我正在编写一个更简单(更快)的 std/boost::function 等价物。我主要关心的是简单性和效率,该平台仅限于 x86-64 linux,使用 gcc 和 clang 编译。
在上述限制下,是否可以假设
- 所有函数指针,即指向自由函数的指针、成员函数(POD、具有虚拟方法的类、派生类、虚拟继承类……)、仿函数、lambda……的大小都最多为 16 个字节?
- 什么是对齐要求?
我正在编写一个更简单(更快)的 std/boost::function 等价物。我主要关心的是简单性和效率,该平台仅限于 x86-64 linux,使用 gcc 和 clang 编译。
在上述限制下,是否可以假设
对于 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!?");
}