在我以前的应用程序中,我有这样一个对象:
class myType
{
public:
int a;
string b;
}它有很多的实例分散在各地,并传递到几乎每一个功能。
这个应用程序很慢。Profiling说,95%的时间被字符串分配器函数占用。
我知道如何处理上面的对象,但不知道如何处理字符串指针。
class myType
{
public:
int a;
string* b;
}他们让我用上面的指针。
访问字符串值
修改字符串值而不修改对象中的字符串值(复制?)
如果我使用字符串指针,一般情况会改变吗?
发布于 2010-04-19 13:18:16
实际上,它可能会慢一些--您仍然需要创建和复制字符串,但是现在您已经有了动态分配的开销。我的猜测是,您复制对象太多了--每当您调用一个函数时,您的myType对象应该尽可能地作为const引用传递,而不是按值传递:
void f( const myType & mt ) {
// stuff
}如果您实际上需要更改mt,您将使用一个非const引用-这也比传递值和使用修改的字段返回一个新值更便宜。
发布于 2010-04-19 13:19:31
我觉得用这样的指针是个坏主意。相反,看看您的myType是如何被使用的。特别是,与之相反的是:
void foo(myType a)
{
// ...
}考虑到这一点:
void foo(myType const &a)
{
// ...
}在前一种情况下,需要创建myType的副本以传递给函数foo(),在第二种情况下,不需要复制,因为引用被传递了(它被标记为const,这样您就可以确保foo()不会尝试修改它--给您(几乎)与第一种方法相同的行为)。
也许还有其他的事情你可以改变,但我猜这样做会给你带来最大的回报(这是一个相当机械的改变,希望不会有太多的问题被引入)。
发布于 2010-04-20 02:58:19
要添加到其他答案,您还应该确保传递字符串的该类的任何成员函数都是通过const引用传递的。例如,假设类构造函数定义如下所示:
myType::myType(int a, string b)用这个代替:
myType::myType(int a, const string& b)因此,基本上,在整个项目中遍历所有函数参数,并将string更改为const string&,将myType更改为const myType&。仅凭这一点就可以解决大多数性能问题。
注意:关于动态分配字符串并将其作为指针传递:这不是一个好主意,似乎它会在一定程度上减轻性能负载,您将非常容易受到内存泄漏的影响,这使得调试成为一场噩梦(此外,比起缓慢运行,调试对性能的破坏性要大得多)。一般情况下,我强烈反对通过裸露的指针。几乎总有一个更好、更安全的选择。
https://stackoverflow.com/questions/2667612
复制相似问题