函数指针大小在64位linux上

时间:2013-01-19 02:56:26

标签: c++ functional-programming function-pointers

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

根据上述限制,假设

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

1 个答案:

答案 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!?");
}