在一个结构向量中,我应该在结构中使用char[]而不是std::string,这样它们就是POD

In a vector of structs, should I be using char[] instead of std::string in structures so that they are POD?

本文关键字:结构 string std POD char 一个 向量 我应该      更新时间:2023-10-16

我有几个大的(100000到10000000)对象向量。我应该坚持这样的结构吗:

typedef  struct {
  char   name[64];
  int    number;
  long    offset;
}

而不是:

typedef  struct {
  std::string   name;
  int           number;
  long          offset;
}

我想重用包含大量对象的向量,但我担心当我调用clear()时,如果我使用带有std::string的结构,我最终会调用1000000个析构函数。

这是使用std::string与char[]的常见问题吗?

是的,你会得到很多析构函数调用。你的绳子会散落一堆。

如果您的大多数字符串都比64个字符短得多,那么您可能会考虑对它们进行内存池。如果你只添加到向量中,然后在某个时候擦除整个向量,那么效果最好。这样,您就可以将字符串紧密地封装在内存中,只需在结构中存储一个char*

但是,对于内存池和string,字符串数据存储在结构之外的某个位置,这会影响缓存位置。如果您使用内存池,则局部性会更好,因为您可以将许多字符串打包到大块内存中,但它们仍然与其他结构数据相去甚远。如果您的程序从缓存中获得了显著优势,那么您将希望将字符串作为char数组保持内联。

现在的许多字符串类实现都足够智能,可以将短字符串存储在对象内部,而不是堆上。在这些情况下,std::string的析构函数是便宜的。

快速检查是查看&str[0]是否指向str

相关文章: