2

我正在编写一个更简单(更快)的 std/boost::function 等价物。我主要关心的是简单性和效率,该平台仅限于 x86-64 linux,使用 gcc 和 clang 编译。

在上述限制下,是否可以假设

  1. 所有函数指针,即指向自由函数的指针、成员函数(POD、具有虚拟方法的类、派生类、虚拟继承类……)、仿函数、lambda……的大小都最多为 16 个字节?
  2. 什么是对齐要求?
4

1 回答 1

1

对于 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!?");
}
于 2013-01-19T03:01:36.200 回答