在函数中使std :: string静态更快吗?

时间:2018-01-26 14:17:26

标签: c++ memory-management static local-variables

所以我有一个std :: string,每次调用函数时都会使用它。

void doSomething()
{
    ...
    std::string temp_str;
    ...    // bunch of codes which reads and writes to temp_str
}

现在我猜,将std::string temp_str更改为static std::string temp_str是不是更快?

如上所述here,我知道如果变量是在堆栈中分配的,它所做的只是减去ESP,所以它不会对性能产生太大影响。

但是,由于std::string在堆中分配其缓冲区,是不是使static使其重用内存? 如果变量是自动的,那么每次调用函数时对newdelete内存不是一种浪费吗?

嗯,这不仅仅是std::string。我的问题是:

如果函数中的静态对象具有可重用资源(如动态分配的内存)作为成员,那么它是否比自动更快?

1 个答案:

答案 0 :(得分:1)

不要将变量设为静态以提高性能。只有当你希望你的变量具有函数静态行为时才创建一个变量function-static。

  

因为std::string在堆中分配它的缓冲区,不会使它静态使它重用内存吗?

不,它没有。它使你的字符串保持它在已声明它的函数的多个调用中分配的堆内存。

这"保存"带来后果:如果您的函数在声明后期望temp_str为空,则必须手动清除它(这实质上取消了您可能已经拥有的任何保存,并降低了可读性)。否则,字符串将保留已放入其中的最后一个值。

决定使变量变为静态会有更糟糕的后果:由于函数的并发调用现在共享{​​{1}},因此您的函数变为不可重入。这比在字符串构造函数中保存几纳秒要大得多,不要这样做。