C++左值,右值,引用,参数和性能

dwo*_*dgb 0 c++ parameters rvalue lvalue c++11

所以我有一个函数需要将std :: vector作为参数.我想知道声明参数的最佳方法,以便底层数组不会被深度复制,因为它可能相当大.

// which should I choose?
void myFunc(std::vector<char>); // 1
void myFunc(std::vector<char>&); // 2
void myFunc(std::vector<char>&&);  // 3
void myFunc(std::vector<char>*) // 4
Run Code Online (Sandbox Code Playgroud)

我该选哪个?另外,我不会修改函数中的向量,所以不应该添加const?我应该重载该功能并将它们组合在一起吗?

eml*_*lai 6

  1. 如果你打算在函数内复制它:

    void myFunc(std::vector<char>);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果你只想阅读参数而不复制它:

    void myFunc(const std::vector<char>&);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果要修改传递给函数的原始向量:

    void myFunc(std::vector<char>&);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果要优化rvalues 或者如果要将参数移动到函数中:

    void myFunc(std::vector<char>&&);
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果您需要能够表示通过引用传递的可选参数:

    void myFunc(const std::vector<char>*);
    
    Run Code Online (Sandbox Code Playgroud)
  6. 如果你需要传递一个你想修改的可选参数nullptr:

    void myFunc(std::vector<char>*);
    
    Run Code Online (Sandbox Code Playgroud)