簡體   English   中英

如何從 C++11 中的 std::future 移動結果?

[英]How to move a result from an std::future in C++11?

我想在我的程序中異步處理std::vector<int> 然而,對象的檢索不使用移動語義。

我創建了一個最小的工作示例並將其附在下面。 根據cplusplus.com ,復制和構造向量的移動語義在移動到的 object 的大小中是線性的,並且在移動到的 object 的大小中是恆定的(使用相同的分配器)標准一)。 根據cplusplus.com再次,當從std::future<T>::get()檢索 object 並且T既不是void也不是引用類型(不是這種情況)時,它的行為就像移動值一樣。

我什至嘗試只使用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;
}

但是,當我執行上面的代碼時,我看到執行時間線性增加,范圍從

第一個:13440ns 第二個:9919ns

對於最小的 arrays 尺寸到

第一個:25919ns 第二個:300147450ns

對於最大的一個。

我在 Win10 上使用 VS2019 並為 x64 編譯,如果這是出於興趣的話。

時間成本可能來自向量的破壞。


我做了一個測試,當結果保存在另一個向量中時時間不會增加(即防止破壞)

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


在您的原始代碼中,時間確實增加了

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM