c++ - 有没有更快的方法从成员函数返回格式化字符串?
问题描述
我创建了一个数学向量类,因为它可以每秒实时调用 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));
}
解决方案
我同意评论者的观点,即性能对你来说不太可能是一个可衡量的问题——至少在任何现代计算机上都不是——但如果你想减少开销,只是一个练习,你可以改变写入调用者的方法- 提供字符数组而不是返回 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!
推荐阅读
- c++ - 具有部分固定类型的递归数据类型
- c++ - Visual Studio 2019 中的上下文菜单项“查看代码”有什么功能?
- revit-api - Document ExportImage 命令创建具有不同扩展名的图像文件
- javascript - 使用 VueJS 填充的 html 表销毁和重新渲染 DataTable
- javascript - 将鼠标悬停在特定文本上并在 CSS 中显示图像
- node.js - 使用猫鼬从 Atlas Mongo 获取数据到 Angular 应用程序
- r - 如何将每个计划点的文本放在r中
- python - Python - 如何将 2D 灰度图像转换为 1D 矢量
- powerbi - 如何在 power bi 中进行迭代?
- ios - iOS中推送通知的振动取决于客户端或有效负载