1

我有几个大型(100,000 到 10,000,000)个对象向量。我应该坚持使用以下结构:

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

代替:

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

我想重用包含这么多对象的向量,但我担心当我调用 clear() 时,如果我将结构与 std::string 一起使用,我最终会得到 1,000,000 次析构函数调用。

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

4

2 回答 2

2

是的,你会收到很多析构函数调用。你的琴弦会散落在整个堆上。

如果您的大多数字符串都比 64 个字符短得多,那么您可能会考虑对它们进行内存池化。如果您只添加到向量中,然后在某个时候擦除整个内容,则此方法效果最佳。这样,您可以将字符串紧紧地打包在内存中,并将 a 存储char*在您的结构中。

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

于 2013-08-15T03:54:55.730 回答
1

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

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

于 2013-08-15T14:02:12.900 回答