C++将长字符串传递给构造函数或setter

标签 c++ c++11 parameter-passing glib stdstring

我有一个带有 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/

相关文章:

c++ - C++中的指针和字节数组

c++ - 在 CLion 项目中链接 boost

c++ - 在运行循环外声明、分配和释放线程局部指针变量

powershell - 无法通过-Command将脚本 block 作为参数传递给powershell.exe

c++ - realloc 在以前稳定的功能中崩溃

c++ - is_constant_evaluated() 应该产生 constexpr 变量?

C++ 11 - move 非局部变量安全吗?

c++ - 为什么这个编译,模板推导应该失败?

c - 如何将 C_FLOAT 数组传递给 Fortran 子例程

java - 如何将多维数组传递给构造函数?