首页 > 解决方案 > 有没有更快的方法从成员函数返回格式化字符串?

问题描述

我创建了一个数学向量类,因为它可以每秒实时调用 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));
}

标签: c++string

解决方案


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

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

这避免了对 的调用strlen()、将字符从复制bufferstd: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!

推荐阅读