我应该按值传递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);
任何详细的解释将不胜感激。
由于
答案 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::vector
或std::string
)传递给函数时,请使用以下惯用准则:
const
。const
。如果传递的对象是可移动的,您还可以通过 rvalue reference (T&&
)添加一个带参数的重载进行优化。相关信息: