我创建了一个数学向量类,并且由于它可能每秒被实时调用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));
}
答案 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
来填充缓冲区。
如果仅调用此函数数千次,那么这都不重要。您需要调用它数千万次,以使其与众不同。