有没有更快的方法从成员函数返回格式化的字符串?

时间:2018-07-17 03:52:57

标签: c++ string

我创建了一个数学向量类,并且由于它可能每秒被实时调用60次,因此我担心此算法太慢。它基本上以矢量格式获取(x,y)并返回字符串。有没有更快的方法来做同样的事情?

我研究了将“静态”放置在缓冲区数组之前是一种方法。我也不喜欢返回字符串的二进制副本(或者假定为副本构造函数)。它确实需要返回std :: string。

std::string Vector2D::toString() const
{
    char buffer[20];

    snprintf(buffer, 20, "(%.02f, %.02f)", m_x, m_y); 

    return std::string(buffer, strlen(buffer));
}

2 个答案:

答案 0 :(得分:0)

我同意评论者的观点,对于您来说,性能不太可能是一个可衡量的问题-至少不是在任何现代计算机上都是如此-但是如果您仍然想减少开销,只需做个练习,就可以更改编写方法放入调用方提供的字符数组,而不是返回std :: string:

void Vector2D::writeToCharBuffer(char * buffer) const
{
   snprintf(buffer, 20, "(%.02f, %.02f)", m_x, m_y); 
}

这避免了对strlen()的调用,避免了将字符从buffer复制到std:string对象的内部数组中,也避免了std:string的分配(随后释放)堆中的缓冲区,从而将程序的效率提高了可忽略的程度。

缺点是呼叫者难以正确使用,例如代替

std::string s = vec.toString();

他现在必须做类似的事情:

char tempBuf[20];
vec.writeToCharBuffer(tempBuf);

...如果上帝忘记了该功能需要至少20个字节的缓冲区,上帝会帮助他:

char tempBuf[10];               // oopsie
vec.writeToCharBuffer(tempBuf); // buffer overflow -> undefined behavior, chaos and despair!

答案 1 :(得分:0)

您可以使用strlen的返回值保存snprintf调用。

通过将字符串预分配为缓冲区大小,直接在字符串的存储中调用string,然后将其大小调整为返回值{{1,您可以将副本保存到snprintf缓冲区中}}。

通过调用一些专用的数字格式设置功能(沿snprintf行,但不完全符合itoa,可以做得比这更好一点,因为这不执行浮点运算或接受精度) )填充缓冲区,而不是itoa来填充缓冲区。

如果仅调用此函数数千次,那么这都不重要。您需要调用它数千万次,以使其与众不同。