gpt4 book ai didi

c++ - 闭包捕获的变量存储在哪里?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:53 30 4
gpt4 key购买 nike

我正在处理内存密集型应用程序,它应该能够正确处理内存不足的情况。

我有类似的东西

class memory_manager {
// returns true if slot created (and function is being run)
// false otherwise
static bool create_slot(int id, std::function<void (slot&)>); ........
}

此类处理、记录等所有内存不足问题,保留所有插槽的所有权,并驱动并发。

但是,我对以下代码未处理 std::bad_alloc:

slot_data_to_copy dat;

memory_manager::create_slot(100, [&dat](slot& sx) { sx.assign_data(dat); });

我假设抛出是在捕获变量期间完成的。 (我实际上捕获了更多,这只是一个示例)

闭包是在哪里创建的?我能控制吗?或者,如果我以采用参数的方式更新管理器,例如

slot_data_to_copy dat;

memory_manager::create_slot<slot_data_to_copy>
(100, dat, [](slot& sx, slot_data_to_copy& dat)
{ sx.assign_data(dat); }
);

能保证完全不抛出吗?

我在 Windows 上使用 Visual C++ 并在 Linux 上使用 GCC 进行编译,但我只在 Windows 上观察到这种行为(在 Linux 上,我可能在我可以处理的地方耗尽了内存)。

编辑:

http://en.cppreference.com/w/cpp/utility/functional/function/function - std::function 包含 nothrow operators..我可能遗漏了一些东西,但是在这种(lambda)情况下使用了哪个?

最佳答案

Where is the closure created?

lambda 表达式创建一个未命名类型的对象,它只是一个普通的仿函数类。捕获的变量是该未命名类型的成员。

您的代码 memory_manager::create_slot(100, [&dat](slot& sx) { sx.assign_data(dat); }); 本质上与:

slot_data_to_copy dat;

struct unnamed_lambda_type {
slot_data_to_copy &dat;

unnamed_lambda_type(slot_data_to_copy &dat_) : dat(dat_) {}

void operator() (slot &sx) const {
sx.assign_data(dat);
}
};

memory_manager::create_slot(100, unnamed_lambda_type(dat) );

Where is the closure created?

闭包对象就像任何其他临时对象一样,通常分配在堆栈上。

关于c++ - 闭包捕获的变量存储在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280060/

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