C++减少了字符串内存的使用
C++ reduce string memory usage
我需要存储很多长度不变的短字符串。我注意到一个字符串对象分配8个字节,即使它包含一些字符,这也会让我遇到内存问题。
有没有办法告诉C++它应该只为字符串分配n(常量)字节?还是必须使用字符数组?
由于字符串大小不变,您可能需要分配一个二维数组(每行都是一个字符串)。在初始化时分配一次阵列。这是最紧凑的形式。
如果字符串数量未知,请考虑使用字符数组的std::vector
。我建议在创建向量时保留较大的大小,以减少数量或重新分配。
此外,问问自己,在程序运行期间,字符串是否需要存储在内存中。你会访问(搜索)它们吗?可以将数据放入文件或数据库中吗?
std::string确实有一个接受char*和大小的构造函数,但一些std:∶string实现不使用小字符串优化,因此它们总是包含一个指向实际数据的指针,这需要一些空间。如果您使用GCC,它会使用写时复制来节省空间,这也需要一个指针。如果有许多重复的字符串,您可以通过使用映射或一组字符串来消除重复来节省空间。或者,您可以只使用char数组,这是最基本的形式,开销最低,但也不太舒适。
在32位系统上,指针和计数都是8字节。很难让一根绳子比它小。带有SSO的字符串可能大于8个字节。(可能是4字节-计数为1位。1位表示是否为小字符串。12字节的小字符串缓冲区或4字节指针+4字节容量=>总共16字节。)
如果它们是恒定长度的(并且您可能不需要std::string
的大部分功能),那么您可能需要编写自己的文本id类。(可能与std::string
之间有转换。)
可能是一个合适的指南:https://akrzemi1.wordpress.com/2015/05/14/handling-short-codes-part-i/
- 将字符串存储在c++中的稳定内存中
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 字符串共享内存映射的向量
- C++将字符串传递给 C 库以进行内存管理
- 内存增加和字符串流?
- 如何从内存中读取字符串?
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 交换两个字符串时访问正确的内存时,我遇到了分段错误
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 字符串的内存高效向量
- 为什么cout输出内存地址不是字符串?
- 如何使用 RPM 从内存中读取标准::字符串
- 在带有 (void*) 强制转换的字符串中打印字符的内存地址
- Visual C 运行时:Malloc将指针返回到已经使用的内存(包含实际字符串)
- 字符串标记化期间的内存损坏
- 如果我不将预先编写的字符串保存到变量,它还在内存中吗?
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- 删除字符串指针在struct中的内存
- 字符串编码用于内存优化