为什么局部变量的vector :: push_back没有移动优化?

时间:2017-07-28 07:57:22

标签: c++ c++11 compiler-optimization stdvector move-semantics

在C ++ 11中,您可以将std::vector::push_backstd::move结合使用,以避免在将元素插入向量时复制。标准中是否有一节禁止编译器自动使用调用std::move后未使用的局部变量push_back?当填充具有大元素的向量时,这可以带来巨大的性能益处。

我使用gcc 7.1.0和-O3检查了以下代码,使用版本1打印move,而版本2打印copy

#include <iostream>
#include <string>
#include <vector>

struct S
{
    S() = default;
    S(S const&) { std::cout << "copy" << std::endl; }
    S(S &&) { std::cout << "move" << std::endl; }
    std::string a;
    std::string b;
};

void fill_members(S& s) { /*...*/ }

int main()
{
    std::vector<S> v;
    {
        S s;

        // Somehow fill members of s, maybe use a function call for that.
        fill_members(s);

        // Version 1:
        // This avoids a copy, since there is an explicit std::move.
        v.push_back(std::move(s));

        // Version 2:
        // Why dont compilers optimize this with std::move?
        // The compiler can see that s is not used after this line.
        v.push_back(s);
    }
}

0 个答案:

没有答案