我应该使用指向 std::string 的指针吗

发布于 12-12 20:49 字数 442 浏览 1 评论 0原文

在学习 C++ 时,我首先使用 Qt 库,而不是标准的 C++、STL 等(好吧,所以我是 C++ 新手,被 Qt 宠坏了)。在 Qt 上,QString 使用隐式共享,因此使我能够将其复制分配给另一个变量,例如:

QString var1=QString("Hi there!");
QString var2=var1

这样就可以很好地完成任务,而无需太多开销。但现在,我正在尝试 std::string 那么,我应该这样做

std::string var1=std::string()

还是,

std::string* var1=new std::string()

还有,QVector 和 std::vector 怎么样。如果我必须使用指针...有什么建议吗?

In learning c++, I first use Qt library instead of the standard C++, STL and all that (Ok, so I'm new with c++ and spoiled by Qt). On Qt, QString used implicit sharing, thus enabling me to just copy assign it to another variable like:

QString var1=QString("Hi there!");
QString var2=var1

And that would do nicely without much overhead. But now, i'm trying std::string so, should I do

std::string var1=std::string()

or

std::string* var1=new std::string()

And also, how about QVector and std::vector. And If I do have to use the pointer... any tips?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

深者入戏2024-12-19 20:49:49

std::string 是否使用写时复制取决于实现(即您的标准库供应商决定)。然而,大多数 std::string 实现不会使用 COW,主要是因为大多数(如果不是全部)读取操作都会强制进行复制 - operator[] 返回一个引用、c_str()data() 返回一个指针。将此与 QString::operator[] 进行比较,后者返回代理对象。

尽管存在上述情况,但不要使用指向 std::string 的指针,除非您确定(通过测量)字符串副本是应用程序中的瓶颈。

另外,请注意 QString 存储 UTF-16 字符串,而 std::string 存储 char 序列 -- QByteArray 将是 Qt 的等效项。

Whether std::string uses copy-on-write depends on the implementation (i.e. your standard library vendor decides that). However, most std::string implementations will not use COW, largely due to the fact that most if not all read operations force a copy -- operator[] returns a reference, c_str() and data() return a pointer. Compare this to QString::operator[], which returns a proxy object.

In spite of the above, don't use pointers to std::string, unless you determine (by measuring) that string copies are the bottleneck in your application.

Also, beware that QString stores UTF-16 strings, whereas std::string stores a sequence of chars -- QByteArray would be the Qt equivalent.

不乱于心2024-12-19 20:49:49
std::string var1("Hi there!");
std::string var2=var1; 

std::string 类有一个 = 运算符定义为:

string& operator= ( const string& str );
std::string var1("Hi there!");
std::string var2=var1; 

std::string class has an = operator defined as:

string& operator= ( const string& str );
那一片橙海,2024-12-19 20:49:49
std::string* var1=new std::string()

不要那样做。尽可能通过引用传递它:

void f(const std::string& s); // no copying

如果您确实需要共享字符串,请使用:

std::shared_ptr<std::string> var1 = std::make_shared<std::string>();
std::string* var1=new std::string()

Don't do that. Just pass it by reference wherever possible:

void f(const std::string& s); // no copying

If you really need to share the string, use:

std::shared_ptr<std::string> var1 = std::make_shared<std::string>();
他不在意2024-12-19 20:49:49

如果您要从函数返回 std::string ,则不要使用指针 - 按值返回。在这种情况下,很可能会应用返回值优化,并且不会复制字符串数据。

If you are going to return std::string from function then don't use pointer - return by value. In this case most likely Return Value Optimization will be applied and string data will not be copied.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文