0

我有一个带有 Glib::ustring 成员的类(如果你不熟悉它,假设它是 std::string),它应该包含一个长字符串,即至少一个段落,也许更多。甚至可能超过 10 段。该字符串计划在 GUI 中显示,因此将来可能会将其存储在文本小部件的缓冲区中,但现在它只是我的 C++ 类的字符串成员对象。

问题是:如何将字符串传递给构造函数,以及如何将其传递给 set_string() 设置方法。长字符串意味着大副本,所以我认为一个好的解决方案是采用右值引用并将 std::move 参数放入成员对象中。但我也不希望类接口令人惊讶且难以使用/理解。你知道,最不意外的规则。

所以我在想,在这种情况下,预期/常见的解决方案是什么?

(对于 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 帖子的答案是按值传递以允许优化)

4

2 回答 2

4

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

string假设你string有一个高效的移动构造函数,你的函数应该取值。

当您期望字符串很长时,调用者调用std::move并将值传递给设置器/构造器。这并不奇怪,因为std::move它非常明确地表明您正在移动数据。

If your system has no more than a modest amount of concurrency, and you rarely modify strings (really, most strings are shared far more than they are modified) shared pointers to immutable strings is actually a pretty useful pattern. (The shared write data is the reference count, so with high levels of concurrency can cause contention)

于 2013-02-12T16:06:55.430 回答
1

我会去找参考资料(不仅传递它们,还要存储参考资料)。但是,二传手必须重新安装参考,这是不可能的。如果确实需要在构造后更改字符串,则必须使用指针(可能是智能指针)。

根据周围的代码,您可能希望使用字符串的共享所有权。在这种情况下,我会使用std::shared_pointer<GLib::ustring>. 如果你需要一个 setter。(否则,参考更好。)

请注意,“某些段落”不是很长的字符串。在用户界面中,几毫秒的延迟,比如说在加载一些文本文件时,是完全可以接受的。与往常一样:请首先分析您的代码,检测瓶颈,然后在需要时进行优化以使其更快。

于 2013-02-12T16:02:16.717 回答