我有一个带有 Glib::ustring 成员的类(如果你不熟悉它,假设它是 std::string),它应该包含一个长字符串,即至少一个段落,也许还有几个.甚至可能超过 10 段。该字符串计划显示在 GUI 中,因此也许将来它会存储在文本小部件的缓冲区中,但现在它只是我的 C++ 类的一个字符串成员对象。
问题是:如何将字符串传递给构造函数,以及如何将其传递给 set_string() setter 方法。一个长字符串意味着一个大拷贝,所以我认为一个好的解决方案是采用右值引用并将参数 std::move 到成员对象中。但我也不希望类接口(interface)令人惊讶且难以使用/理解。你知道,最不意外规则。
所以我在想,在这种情况下,预期/常见的解决方案是什么?
(对于 setter 方法,这里有另一种选择:因为编辑是在 GUI 中完成的,所以只需让 GUI 直接编辑字符串,然后 setter 方法的唯一用途就是以编程方式完全替换字符串,例如重置它或撤消最近的编辑)
class MyClass
{
public:
explicit MyClass (Glib::ustring str);
void set_string (Glib::ustring str);
private:
Glib::ustring str;
}
(我看过现有库的代码,例如 gtkmm,通过 const 引用获取字符串,但我也看到 SO 帖子的答案是按值传递以允许优化)
最佳答案
http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
假设您的 string
具有高效的移动构造函数,您的函数应按值获取 string
。
当您预计字符串会很长时,调用者调用 std::move
并将值传递给 setter /构造函数。这并不奇怪,因为 std::move
非常明确地表示您正在移动数据。
如果您的系统只有适度的并发量,并且您很少修改字符串(实际上,大多数字符串的共享远多于修改),指向不可变字符串的共享指针实际上是一个非常有用的模式。 (共享写数据是引用计数,高并发会引起争用)
关于C++将长字符串传递给构造函数或setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14836473/