如何优化这个 toString() 成员函数

How to optimize this toString() member function?

本文关键字:toString 成员 函数 优化 何优化      更新时间:2023-10-16

我有一个Vector2D对象,它返回其当前坐标的字符串表示形式,称为Vector2D::toString()。由于Vector2D::toString()可能经常被调用,我想知道是否有更快的方法来返回一串坐标。

string Vector2D::toString()
{
    char buffer[64];
    int length;
    sprintf_s(buffer, 64, "(%.2f, %.2f)", m_x, m_y);
    return string(buffer, strlen(buffer));
}

我觉得它做了太多的工作,但我可能是错的。如何优化?

更新:

string Vector2D::toString()
{
    static char buffer[64];
    static int length;
    length = sprintf_s(buffer, 64, "(%.2f, %.2f)", m_x, m_y);
    return string(buffer, length);
}

您可以实现另一个版本,允许传入string&,以便它将写入预分配的字符串缓冲区。这样可以防止string构造函数每次都必须创建 char 缓冲区的副本。如果容量太小,您需要支付调整大小的惩罚,但如果您反复调用toString它应该只需要实际重新分配一次,之后相同的string每次都有足够的容量。

我的理解是,如果调整大小小于容量,std::string 通常不会减少其容量。从技术上讲,向下调整大小是否会导致 realloc 是特定于实现的,但您可以自己测量它以验证它的行为是否正确。

这是我脑海中浮现的

草图。抱歉,如果有任何错误。随意删除任何中间变量 - 为了可读性,我主要将它们留在那里。

void Vector2D::toString(const string& strBuffer)
{
    const int requiredCapacity = 50;
    strBuffer.resize(requiredCapacity);
    int writtenLength = sprintf_s(strBuffer.data(), requiredCapacity, "(%.2f, %.2f)", m_x, m_y);
    strBuffer.resize(writtenLength);
}

例:

string myString;
// I'm making some guesses as to your Vector2D implementation for example purposes
Vector2D myVector(1, 0);
myVector.toString(&myString);
// myString now contains "(1, 0)" and a  so size() should return 7,
// capacity() should return at least 50 because of the initial resize()
// inside toString. It will probably be more because of the allocator's
// behavior.
myVector.set(1.3847, 2.3881);
myVector.toString(&myString);
// myString now contains "(1.3847, 2.3881)" and a , but it likely did
// not need re-allocation because it already had enough capacity from the
// first time around.