当前位置: 首页 > 知识库问答 >
问题:

在结构的向量中,我应该在结构中使用char[]而不是std::string,以便它们是POD吗?

潘衡
2023-03-14

我有几个大的(100,000到10,000,000)向量的对象。我应该坚持这样的结构:

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

而不是:

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

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

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

共有2个答案

佴德曜
2023-03-14

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

快速检查是看是否<代码>

刘奇
2023-03-14

是的,你会接到很多破坏者的电话。你的琴弦会散落在整个堆里。

如果您的大多数字符串都比64个字符短得多,您可以考虑使用内存池。如果只向向量中添加内容,然后在某个时候删除整个内容,则效果最佳。这样,您可以在内存中紧密地打包字符串,只需在结构中存储一个字符。

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

 类似资料:
  • 问题内容: 我想我需要反射包才能做到这一点。说我有一个像这样的结构: 说我想生成ResolutionValue结构的JSON表示…是否有某种方法可以创建不实例化的JSON表示? 问题答案: 即使使用反射,也需要使用实际值来获取类型。因此,我建议您只使用类型的零值。

  • 问题内容: 我正在考虑将Java用于大型项目,但是我找不到能够在Java中远程表示结构的任何东西。我需要能够将网络数据包转换为可在应用程序中使用的结构/类。 我知道这是可以使用,但这种方式是 不 接受的。因此,我很好奇是否可以像在C语言中那样将一组字节“广播”到一个结构中。如果这不可能,那么我将无法使用Java。 因此,我要问的问题是,是否有可能无需指定对齐方式和数据类型就将任何类型的对齐数据都转

  • 看了css禅意花园这本书有感(可能看的不是很详细) 书中作者更倾向于使用background, 而不是一个专门的<img>标签来设置图片(不仅仅是整个页面的背景, 包括页面标题附近图片, logo等). 有的甚至会在div的最后用几个div, 通过css的绝对定位是控制来展示图片. 与之对应的另外一种做法, 比如标题那里有图片,就直接用img预留位置了. 这两种做法哪种更普遍,主要的优缺点是什么?

  • 问题内容: 在玩过Go HTML模板后,我发现所有用于遍历模板中对象的示例都是将切片的结构传递给模板,有点像此示例中所示: 其中“主要”模板为: 这有效,但是如果我仅使用.Name属性,则我不明白如何在每个ID旁边显示每个ID。我会发现在显示时将每个用户视为一个对象来对其属性进行分组会更合乎逻辑。 因此,我的问题是: 如果我想将结构片段传递给模板怎么办? 使它起作用的语法是什么?我尚未在官方htm

  • 我今天有一个讨论,我的一些同事说他们像这样注入他们的 Angular 服务: 他们说他们这样做是因为它阻止了我的组件的消费者更改注入的服务,有点像: 因此,虽然从技术上讲他们是对的,但我仍然不相信我应该这样做。我问自己以下问题: > DI是Angular的基础部分,如果有人真的这么做了,这个人是应该更好地跑进这个坑里失败还是应该他/她根本做不到这一点 在这种情况下, 对于出于几个原因开始学习 An