上下文:我正在编写一个库,它为许多stdlib数据结构中的自定义分配器公开,以便为想要自定义内存分配以实现实时性能的用户提供服务.
我想使用std :: promise和std :: future的自定义分配器.我的理解是,当一个allocator传递给std :: promise时,它的未来对象也会使用该自定义分配器.
我的测试覆盖全局new和delete以跟踪调用默认运算符的次数.我还实现了一个使用malloc和free的自定义分配器,但使用不同的状态来计算分配/解除分配(在实际例子中,它将替换为实时安全分配器).
看来,当我为一个“大”对象调用std :: promise :: set_value时,调用全局运算符new和delete,即使promise是使用自定义分配器构造的.
这是一个基本的例子. (为简洁起见,删除了分配器样板,您可以在Gist:https://gist.github.com/jacquelinekay/a4a1a282108a55d545a9上看到完整的可编译版本)
struct Foo {
std::vector<int, InstrumentedAllocator<int>> bar;
};
int main(int argc, char ** argv) {
(void) argc;
(void) argv;
InstrumentedAllocator<void> alloc;
std::promise<Foo> promise_(std::allocator_arg, alloc);
std::shared_future<Foo> future_ = promise_.get_future().share();
// Start a thread that blocks for a few ms and sets the future value
std::thread result_thread(
[&promise_]() {
Foo result;
result.bar.push_back(1);
result.bar.push_back(2);
result.bar.push_back(3);
// test_init starts counting calls to global new/delete
// (stored in variables global_runtime_allocs/deallocs)
test_init = true;
std::this_thread::sleep_for(std::chrono::milliseconds(5));
promise_.set_value(result);
test_init = false;
}
);
future_.wait();
result_thread.join();
std::cout << "Runtime global allocations: " << global_runtime_allocs << " (expected: 0)" << std::endl;
std::cout << "Runtime global deallocations: " << global_runtime_deallocs << " (expected: 0)" << std::endl;
}
此示例的全局运算符new也打印“运行时”分配的大小(来自std :: promise :: set_value),从而产生以下输出:
$clang++ promise_allocator.cpp -std=c++11 -lpthread
$./a.out
Allocation size: 16
Runtime global allocations: 1 (expected: 0)
Runtime global deallocations: 1 (expected: 0)
我在gcc 4.8和Clang 3.4上得到了相同的结果.这是对标准的正确解释吗?我希望set_value使用promise的分配器.
最佳答案 这似乎是4.9版本系列libstdc中的一个错误,该错误在版本5发行版系列中得到修复.使用
version 5.1或更高版本在Wandbox上运行您的要点仅产生输出:
Runtime global allocations: 0 (expected: 0) Runtime global deallocations: 0 (expected: 0)