如何优化这个 toString() 成员函数
How to optimize this toString() member function?
我有一个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.
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 如何优化这个 toString() 成员函数