gpt4 book ai didi

c++ - 如何从 C++11 中的 std::future move 结果?

转载 作者:行者123 更新时间:2023-11-30 03:13:23 26 4
gpt4 key购买 nike

我想异步处理 std::vector<int>在我的程序中。然而,对象的检索不使用 move 语义。

我创建了一个最小的工作示例并将其附加在下面。根据cplusplus.com ,复制和构造 vector 的 move 语义在 move 对象的大小上是线性的,在 move 对象的大小上是常量,只要它们共享相同的分配器(我使用的是标准分配器)。根据cplusplus.com同样,当从 std::future<T>::get() 中检索对象时和 T既不是 void也不是引用类型(事实并非如此),它的行为就像 move 值。

我什至尝试只使用 inputs[i].get();而不是在第二个循环中,当前在评论中,并且没有将其分配给任何东西。这仍然会增加线性时间。

std::vector<std::vector<int>> GenerateTestCases(int input_size, int number_inputs) {
std::vector<std::vector<int>> cases(number_inputs);

for (auto i = 0; i < number_inputs; i++) {
std::vector<int> some_vector(input_size);
cases[i] = std::move(some_vector);
}

return std::move(cases);
}

int main() {
for (auto i = 0; i < 25; i++) {
auto size = (int)pow(2, i);
int iterations = 100;

auto test_cases = GenerateTestCases(size, iterations);

std::vector<std::future<std::vector<int>>> inputs(iterations);

const auto start = std::chrono::high_resolution_clock::now();

for (auto i = 0; i < test_cases.size(); i++) {
std::promise<std::vector<int>> prom;
prom.set_value(std::move(test_cases[i]));

inputs[i] = std::move(prom.get_future());
}

const auto middle = std::chrono::high_resolution_clock::now();

for (auto i = 0; i < test_cases.size(); i++) {
//inputs[i].get();
auto& result = (inputs[i]);
auto value = std::move(result.get());
}

const auto end = std::chrono::high_resolution_clock::now();

const auto elapsed_first = std::chrono::duration_cast<std::chrono::nanoseconds>
(middle - start).count();

const auto elapsed_second = std::chrono::duration_cast<std::chrono::nanoseconds>
(end - middle).count();

std::cout << "First: " << elapsed_first << std::endl;
std::cout << "Second: " << elapsed_second << std::endl;
std::cout << std::endl;
}

char c;
std::cin >> c;
}

但是,当我执行上面的代码时,我看到执行时间呈线性增加,范围从

First: 13440ns Second: 9919ns

最小的数组大小为

First: 25919ns Second: 300147450ns

对于最大的一个。

我在 Win10 上使用 VS2019 并为 x64 编译,如果这是出于兴趣的话。

最佳答案

时间成本大概是来自vector的破坏。


我做了一个测试,当结果保存在另一个 vector 中时,时间不会增加(即防止破坏)

http://coliru.stacked-crooked.com/a/dc7792496a981de3


虽然在您的原始代码中,时间确实增加了

http://coliru.stacked-crooked.com/a/66b96809fb35b3d2

关于c++ - 如何从 C++11 中的 std::future move 结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58732963/

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