通过值或const引用函数?

时间:2015-01-28 23:42:13

标签: c++ set parameter-passing pass-by-reference pass-by-value

我应该按值传递std::string还是引用一个函数。此函数将此值存储在类的成员变量中。

关于传递值或引用,我总是很困惑。请清楚我对此的困惑。

这是代码:

class DataStore {
public:
    void addFile(const string& filename, const set< std::string>& filePaths)
    {  
        if (dataStoreMap.insert(make_pair(filename, filePaths)).second)
        {
            cout << "Data Added" <<endl;
        }
        else
        {
            cout << "Data not Added" << endl;
        }
    }
private:
    // member variable
    map < string, set < string >  > dataStoreMap;
};

我应该像这样做函数声明:

void addFile(const string& filename, const set< std::string>& filePaths)

void addFile(const string filename, const set< std::string> filePaths)

两者都给出相同的结果。如果有任何关于内存分配或性能的问题。

来自cpp课程的上述函数调用。

DataStore ds;
set<string> setFileDirectory{ "1", "2", "3", "4", "6", "5" };
ds.addFile("file.txt", setFileDirectory);

setFileDirectory.erase(setFileDirectory.begin(), setFileDirectory.end());
setFileDirectory.insert({ "1", "2", "3", "4", "5", "6" });
ds.addFile("demo.txt", setFileDirectory);

任何详细的解释将不胜感激。

由于

4 个答案:

答案 0 :(得分:2)

如果你有一个输入参数,即该功能观察修改的东西,请考虑通过传递它const引用const &),以避免无用的深拷贝(可能需要动态内存分配等)。

void addFile(const std::string& filename, 
             const std::set<std::string>& filePaths)

<强> P.S。
当然,如果您传递便宜的复制参数,例如int s,您只需传递值:)

答案 1 :(得分:0)

如果您的容器集具有巨大的大小并且传递字符串的功能相对较小,我可以使用如下:

void addFile(const string filename, const set< std::string> & filePaths)

答案 2 :(得分:0)

第一个有更好的&#34;性能,因为第二个在传递之前制作了string的副本。由于您没有修改string,因此在调用函数中没有向下传递对实际字符串的引用而不是复制,并且复制引用所需的内存少于{{1} }。也就是说,如果您从未在string变量上抛弃const说明符,编译器可能会最终等同于对它们进行处理。这种差异在大型参数上更有用,例如,如果您的string变量有几千个元素,那么通过引用而不是按值传递它可能会有非常显着的差异。

相关:Is it better in C++ to pass by value or pass by constant reference?

答案 3 :(得分:0)

首先,你应该永远通过 const传递参数,因为几乎没有任何理由。按值传递已确保您无法在呼叫站点更改变量,因为已复制

现在,仍然存在关于通过值或引用传递参数的问题。答案比预期的要复杂得多。 Stack Overflow上有很多很好的答案。

简而言之,将潜在的大型对象(如std::vectorstd::string)传递给函数时,请使用以下惯用准则:

  • 通过观察(只读)时,参考const
  • 当传递要保留(所谓的接收参数)副本的参数时,也会通过引用传递给const。如果传递的对象是可移动的,您还可以通过 rvalue reference T&&)添加一个带参数的重载进行优化。

相关信息: