c++ std ::函数类型的Sizeof

std :: function< void(int&)>什么样的魔法从C 11,它的sizeof = 32?如果我将函数引用存储为指针,则只需要8个字节(在64位机器上)。
最佳答案
对于std :: function< Signature>它是对象大小和分配之间的折衷,这是有趣的:对于小功能对象,最好避免分配。另一方面,这样做增加了对象大小。为了使小功能优化成为有用的并且在实际调用对象时不引入开销,对象大小需要至少为两个指针加上一些内存来存储简单的函数对象。看来32字节的大小正好是这样(在sizeof(T *)为8的系统上)。

也就是说,内部是std :: function< Signature>对象存储继承层次结构:基类提供要调用的接口,委托给实现调用接口的模板化派生(加上可能有一些clone()功能)。在针对大小进行优化的实现中,函数对象将只保留指向基础的指针,但是为了避免分配,它将放置一些内部存储以分配整个对象并指向该对象(内部指针避免实际调用时的条件函数对象)。对象所需的内存是虚函数指针加上实际函数对象的任何数据std :: function< Signature>对象初始化。为了容纳成员的功能与他们的对象似乎再两个字是相当小的。

转载注明原文:c++ std ::函数类型的Sizeof - 代码日志