C++减少了字符串内存的使用

C++ reduce string memory usage

本文关键字:内存 字符串 C++      更新时间:2023-10-16

我需要存储很多长度不变的短字符串。我注意到一个字符串对象分配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/