【发布时间】:2019-12-09 00:56:45
【问题描述】:
我有一个 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% 肯定,如果有人可以证实我的假设。
【问题讨论】:
-
3500 个股票乘以 100 个额外浪费的字节仍然只有 341KiB。在 32GiB RAM 的日子里,imo 不值得担心。除非您的基准另有说明,否则不要担心缓存的引用位置。
-
上限为 6 个字节,只需使用数组和 string_view (C++17) 或 char* 。 6 个字节小于指向数据的指针的大小。
-
查找“小字符串优化”以查看您的数据(可能)如何存储在字符串对象中;它没有分配超出基本字符串对象的额外内存。
-
如果您真的需要优化空间,请将股票代码标识符存储在单例向量中,并让交易使用 16 位短来索引该向量。
-
我将添加一个日期变量以及两个额外的双变量用于最高价和收盘价,这个想法是让一个对象代表特定股票的交易日,然后我可以把这些容器中的对象并编写一些函数来查找图表模式。由于会有很多对象,我正在尝试尽可能优化并保持每个对象都很小。我相信最终这些来自 std::string 的额外字节可能会开始降低我的性能。