【问题标题】:Q : std::tuples / std::array问:std::tuples / std::array
【发布时间】:2017-01-12 12:37:28
【问题描述】:

我一直认为std::tuple 很花哨,但效率并不高。

但我了解到元组是连续内存,因为 rules of object layout。我知道tuples 是通过继承生成的,这就是为什么我们不能拥有动态tuples。但在这一点上,这意味着 tuples 非常好 std::array 可以包含任何类型而没有任何缺点。

这样说好像有点太厉害了。

所以我想知道,tuples在内存中怎么样? tuples真的没有其他问题吗?


感谢这些让我头脑清醒的答案,我得到了一个大问题

是一个“大”的结构(这里不能真正写一个大的)像

struct Foo {
  int a;
  float b;
  double c;
};

缓存比数组更友好

std::array<double, 3>

我需要经常访问一个元素并对其进行更改。所以我想知道计算机是否会像在缓存中保存一个大结构体一样容易。


还是谢谢

【问题讨论】:

标签: c++ arrays caching tuples


【解决方案1】:

我一直认为 std::tuple 很花哨,但效率不高。

如您所知,这是无稽之谈。元组通常与具有相同成员的常规类一样高效。

我知道元组是通过继承生成的,这就是我们不能拥有动态元组的原因。

继承是实现元组的一种(典型)方法。你不能有动态元组,因为std::tuple 是一个模板。模板在编译时被实例化。

但在这一点上,这意味着元组非常好std::array,它可以包含任何类型而没有任何缺点。

比较数组和元组就像比较苹果和橘子。能够构造多种类型的元组既是优点也是缺点。数组和元组用于不同的事情。

更恰当的比较是具有相同成员的常规类结构。 tuple 的主要优点是它可以由模板参数生成。 tuple 的主要缺点是不能命名成员。

所以我想知道,内存中的元组如何?

取决于元组是如何实现的。在实践中,它通常与具有相同成员的类的布局非常相似。但不一定完全相同。特别是,内存中成员的顺序可以颠倒也可以不颠倒。

元组真的没有其他问题吗?

你问其他个问题,但你没有证明他们有任何问题。元组有它们的利基,它们很有用。如果您尝试在有用的上下文之外使用它们,那么您会发现问题。

大型结构体是否像数组一样对缓存友好?

元组、其他类和数组都非常相似。它们都是子对象(成员)的平面容器。它们对缓存都和另一个一样友好和无拘无束。

【讨论】:

  • 感谢您的宝贵时间,我在理解元组时确实遇到了一些麻烦。正如你所说,我可以提出最后一个问题:一个大结构是否像数组一样缓存友好?像这样我应该在谷歌上有更多的答案,谢谢。
  • @MathieuVanNevel 将新问题添加到您的问题帖子中。
  • 已更新,谢谢大家 :) 我将在需要时使用元组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2020-02-07
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多