std::function:实现和内存管理
std::function 类充当可调用对象的通用包装器,使任何可调用类型的存储和调用。虽然 lambda 表达式通常被实现为具有函数调用运算符的类,但它们的大小可能会根据引用变量的数量而显着变化。
相反,std::function 必须保持固定的大小,同时容纳各种类型的可调用对象,包括 lambda。它的实现依赖于类型擦除,这涉及创建表示可调用实体的基类。对于与 std::function 一起使用的每个特定可调用类型,都会动态创建并实例化派生类。
例如,考虑用于 double 到 int 函数的 std::function 的简化实现:
std::function 对象将包含基类的 unique_ptr。当使用特定的可调用函数构造 std::function 时,会在堆上创建并实例化派生类。 std::function 对象本身保持固定大小,而可调用对象的内存是动态分配的。
关于复制语义,每个 std::function 对象都维护自己的可调用实体的副本。从以下测试中可以明显看出这一点:
程序的输出表明 f2 和 f3 各自维护单独的可调用对象,从而导致打印不同的递增值。因此,std::function 为其可调用对象管理内存,同时确保 std::function 对象的副本维护自己独立的可调用实体。
以上是`std::function` 如何管理内存和可调用对象?的详细内容。更多信息请关注PHP中文网其他相关文章!