我需要存储大量具有恒定长度的短字符串。 我注意到一个字符串对象分配了8个字节,即使它包含一些字符,这让我遇到了内存问题。
有没有办法告诉C ++它应该只为字符串分配n(常量)字节?或者我必须使用char数组?
答案 0 :(得分:1)
由于字符串是常量大小,您可能需要分配2维数组(每行是一个字符串)。在初始化时分配一次数组。这是最紧凑的形式。
如果字符串数量未知,请考虑使用std::vector
字符数组。我建议在创建矢量时保留大尺寸,以减少数量或重新分配。
另外,问问自己在程序持续时间内是否需要将字符串存储在内存中。你会访问(搜索)他们吗?可以将数据放入文件或数据库吗?
答案 1 :(得分:0)
std :: string确实具有接受char *和大小的构造函数,但是一些std :: string实现不使用小字符串优化,因此它们总是包含指向实际数据的指针,这需要占用一些空间。如果你使用GCC,它会使用copy on write来节省空间,这也需要一个指针。如果有很多重复的字符串,你可以通过使用地图或一组字符串来节省空间,以消除重复。或者你可以使用一个char数组,这是最基本的形式,开销最低但也不太舒服。
答案 2 :(得分:0)
无论如何,32位系统上的指针和计数是8个字节。制作一个比这更小的字符串很难。具有SSO的字符串可能大于而不是8个字节。 (也许4个字节 - 计数1位.1位表示小字符串.12字节小字符串缓冲区或4字节指针+ 4字节容量=>总共16字节。)
如果它们的长度不变(并且鉴于您可能不需要大多数std::string
的功能),您可能需要编写自己的text-id类。 (可能与std::string
之间的转换。)
可能是合适的指南:https://akrzemi1.wordpress.com/2015/05/14/handling-short-codes-part-i/