我一直认为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>
我需要经常访问一个元素并进行更改。所以我想知道计算机是否会像在数组中一样轻松地在缓存中保存一个大结构。
无论如何,谢谢
答案 0 :(得分:1)
我一直认为std :: tuple是一种花哨但不太有效的东西。
如你所知,这是无稽之谈。元组通常与具有相同成员的常规类一样高效。
我知道元组是通过继承生成的,这就是为什么我们不能拥有动态元组。
继承是实现元组的一种(典型)方法。您不能拥有动态元组,因为gradle
是一个模板。模板在编译时实例化。
但在这一点上,这意味着元组是疯狂的好
std::tuple
,它可以包含任何类型而没有任何缺点。
比较数组和元组就像比较苹果和橙子一样。能够构造多种类型的元组同样是一个缺点,因为它是一个优点。数组和元组用于不同的事物。
更恰当的比较是使用具有相同成员的常规类结构。元组的主要优点是它可以通过模板参数生成。元组的主要缺点是你不能命名成员。
所以我想知道,内存中的元组是怎样的?
取决于元组的实现方式。实际上,它通常与具有相同成员的类的布局非常相似。但不一定相同。特别是,记忆中成员的顺序可能会或可能不会逆转。
元组中确实没有其他问题吗?
您询问其他问题,但您没有发现任何问题。元组有它们的利基,它们很有用。如果您尝试在有用的上下文之外使用它们,那么您可以找到问题。
是一个像数组一样缓存友好的大结构吗?
元组,其他类和数组都非常相似。它们都是子对象的扁平容器(成员)。它们每个都是友好的,并且与另一个一样不受缓存。