gpt4 book ai didi

c++ - 不复制就返回std::function

转载 作者:行者123 更新时间:2023-12-01 14:53:19 25 4
gpt4 key购买 nike

从函数调用返回std::function时,返回的函数将是函数定义的副本,还是对函数的引用?

背景:我想避免在我的应用程序中或多或少对性能敏感的部分出现瓶颈。因此,我想避免在不需要的地方进行分配和复制。

示例代码:

typedef std::function<std::unique_ptr<ControllerResponse>(
const std::vector<std::string> &pathComponents,
const std::string &data,
const std::unordered_map<std::string, std::string> &params)
> ControllerMethod;

ControllerMethod RouteIndex::findRoute(
const std::vector<std::string> &pathComponents,
const std::string &method,
std::map<std::string, std::string> &requestParams) {
// ... snip
// suppose globalMap is a class member
return globalMap.InstanceOfControllerMethod;
}
findRoute()会返回副本还是 std::function本身只是引用?

最佳答案

C++标准在std::function复制构造函数上有这样的说法:

function(const function& f);

Throws: shall not throw exceptions if f’s target is a specialization of reference_wrapper or a function pointer. Otherwise, may throw bad_alloc or any exception thrown by the copy constructor of the stored callable object. [ Note: Implementations are encouraged to avoid the use of dynamically allocated memory for small callable objects, for example, where f’s target is an object holding only a pointer or reference to an object and a member function pointer. — end note ]



请务必阅读说明。如果您的回调较小,则无需进行动态分配就可以复制 std::function

因此,在您的示例中,如果 InstanceOfControllerMethod是一个函数指针,则返回副本不应分配内存。但是,如果要在其中放入成员函数指针,则应该改用lambda,因为C++中的成员函数指针在很多方面都已损坏,并且可能太大而无法放入 std::function:
std::function<void()> get_member_function(A *p)
{
return [p]() { p->function(); };
}

由于此类lambda仅包含指针 p,因此可以保证它适合 std::function实例,这与成员函数指针可以使用2个或更多指针不同。

关于c++ - 不复制就返回std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60761727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com