c++ - std::string 分配的内存是否会干扰性能?
问题描述
我有一个 Stock 类,其中一个成员是一个字符串,其最大长度最多为 6 个字符(纳斯达克股票代码不能超过 5 个字符加上添加的 Q,如果它们破产的话)。然而,由于仅纳斯达克就有大约 3500 只股票,我想在制作 Stock 对象时使用尽可能少的数据。std::string 为其内容分配的空间超出了我的需要,我正在尝试减少内存消耗。std::string 使用的额外分配内存会影响我的程序的性能吗?
在下面的代码中,它显示成员变量 symbol 的大小为 15,即使其中只有 4 个字符。我可以在初始化之前在类中使用 str.reserve 将字符串大小限制为 6 个字节,还是应该实例化对象然后调用 symbol.resize(6) 以确保只使用 6 个字节?
#include <iostream>
#include <string>
using namespace std;
class Stock
{
public:
Stock(string s, double o, double c, unsigned int v)
: symbol(s), open(o), close(c), volume(v) {};
~Stock() = default;
string symbol;
double open;
double close;
unsigned int volume;
};
int main() {
Stock AAPL("AAPL", 267.48, 270.71, 26547493);
cout << AAPL.symbol.capacity() << endl;
cout << AAPL.symbol.size() << endl;
return 0;
}
从阅读这个问题的答案STD::string as a Member Parameter for Dynamically Allocated Objects看来,std::string 使用的这个额外分配的空间根本不应该干扰我的程序的内存,但我不是 100%当然,如果有人可以证实我的假设,我更愿意。
解决方案
我认为,最好的方法是结合类型定义。使用char ticker[6+1]
and 如果您需要解析数据或处理它使用std::string_view
.
推荐阅读
- intellij-idea - Intellij Idea Community Edition 2018.3.6 表现非常缓慢
- node.js - $in 的 MongoDB 性能
- node.js - 如何将 base64 字符串作为 Openssl 的输入证书传递?
- c# - 宏获取当前用户宏而不是联系人
- mongodb - 如何在mongodb中使用group by?
- java - 如何从字符串值中删除字符?
- javascript - 通过传递参数通过单击按钮来操作表格列宽
- java - 试图将数据库中的信息显示到终端
- sql - rails 相同模型之间的多个 has_many 关系
- reactjs - 如何在 SilverStripe 项目中构建 React 应用程序(包含 SVG 文件)以保持 SS4 文件夹约定?