【问题标题】:Does std::string allocated memory interfere with performance?std::string 分配的内存是否会干扰性能?
【发布时间】: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 的额外字节可能会开始降低我的性能。

标签: c++ stdstring


【解决方案1】:

我认为,最好的方法是结合类型定义。 使用char ticker[6+1],如果您需要解析数据或处理它使用std::string_view

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多