c - 在 C 中读取和存储字符串列表的最节省内存的方法

标签 c c-strings memory-optimization

我想知道在 C 中读取和存储字符串列表的内存效率最高的方法是什么。

每个字符串可能有不同的长度,所以预先分配一个大的二维数组会很浪费。 我还想避免为每个字符串使用单独的 malloc,因为可能有很多字符串。

字符串将从一个大缓冲区读取到我正在询问的这个列表数据结构中。

是否可以通过一次完全正确大小的分配来单独存储所有字符串?

我的一个想法是将它们连续存储在一个缓冲区中,然后有一个 char * 数组指向缓冲区中的不同部分,其中将以 '\0' 来分隔。不过,我希望有更好的方法。

struct list {
  char *index[32];
  char buf[];
};

数据结构和字符串将是严格只读的。

最佳答案

假设您事先知道所有字符串的长度,这是一种稍微有效的格式:

|| total size |  string 1 | string 2 | ........ | string N | len(string N) | ... | len(string 2) | len(string 1) ||

您可以将长度存储在固定宽度整数或可变宽度整数中,但重点是您可以跳到最后并相对有效地扫描所有长度,并从length sum 你可以计算字符串的偏移量。当没有剩余空间时,您知道什么时候到达最后一个字符串。

关于c - 在 C 中读取和存储字符串列表的最节省内存的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22350147/

相关文章:

c - 空终止与计数变量的优点

c - 为什么这个 if 部分被编译成无限循环?

c - regexec 和 regcomp 比我自己做 strncmp 更有效吗?

c - C 结构中的自动字段重新排序以避免填充

c - windows下c语言一个程序使用的内存,以字节为单位

c - 如何在从 C 中的文件读取时使用指针填充结构数组

C 字符串和十六进制字符

C - 如何获取字符串中特定单词之后的单词?

c# - 内存占用最少的集合?

arrays - 将本地动态数组的长度设置为零会减少内存使用量吗?