首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++字符串指针

C++字符串指针
EN

Stack Overflow用户
提问于 2010-04-19 13:12:56
回答 3查看 347关注 0票数 2

在我以前的应用程序中,我有这样一个对象:

代码语言:javascript
复制
class myType
{
public:
 int a;
 string b;
}

它有很多的实例分散在各地,并传递到几乎每一个功能。

这个应用程序很慢。Profiling说,95%的时间被字符串分配器函数占用。

我知道如何处理上面的对象,但不知道如何处理字符串指针。

代码语言:javascript
复制
class myType
{
public:
 int a;
 string* b;
}

他们让我用上面的指针。

  • ,使用字符串指针的速度有多快?
  • ,当我复制对象时复制什么?
  • ,如何使用带指针的类:

访问字符串值

修改字符串值而不修改对象中的字符串值(复制?)

如果我使用字符串指针,一般情况会改变吗?

EN

回答 3

Stack Overflow用户

发布于 2010-04-19 13:18:16

实际上,它可能会慢一些--您仍然需要创建和复制字符串,但是现在您已经有了动态分配的开销。我的猜测是,您复制对象太多了--每当您调用一个函数时,您的myType对象应该尽可能地作为const引用传递,而不是按值传递:

代码语言:javascript
复制
void f( const myType & mt ) {
    // stuff
}

如果您实际上需要更改mt,您将使用一个非const引用-这也比传递值和使用修改的字段返回一个新值更便宜。

票数 6
EN

Stack Overflow用户

发布于 2010-04-19 13:19:31

我觉得用这样的指针是个坏主意。相反,看看您的myType是如何被使用的。特别是,与之相反的是:

代码语言:javascript
复制
void foo(myType a)
{
    // ...
}

考虑到这一点:

代码语言:javascript
复制
void foo(myType const &a)
{
    // ...
}

在前一种情况下,需要创建myType的副本以传递给函数foo(),在第二种情况下,不需要复制,因为引用被传递了(它被标记为const,这样您就可以确保foo()不会尝试修改它--给您(几乎)与第一种方法相同的行为)。

也许还有其他的事情你可以改变,但我猜这样做会给你带来最大的回报(这是一个相当机械的改变,希望不会有太多的问题被引入)。

票数 3
EN

Stack Overflow用户

发布于 2010-04-20 02:58:19

要添加到其他答案,您还应该确保传递字符串的该类的任何成员函数都是通过const引用传递的。例如,假设类构造函数定义如下所示:

代码语言:javascript
复制
myType::myType(int a, string b)

用这个代替:

代码语言:javascript
复制
myType::myType(int a, const string& b)

因此,基本上,在整个项目中遍历所有函数参数,并将string更改为const string&,将myType更改为const myType&。仅凭这一点就可以解决大多数性能问题。

注意:关于动态分配字符串并将其作为指针传递:这不是一个好主意,似乎它会在一定程度上减轻性能负载,您将非常容易受到内存泄漏的影响,这使得调试成为一场噩梦(此外,比起缓慢运行,调试对性能的破坏性要大得多)。一般情况下,我强烈反对通过裸露的指针。几乎总有一个更好、更安全的选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2667612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档