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

为什么这些元组的大小不一样

云何平
2023-03-14

我对具有“洞”的元组感兴趣。这些孔是空结构。所有孔都将具有相同的类型,在此处称为“空”。

为了说明起见,让

struct DByte {
    std::array<std::byte, 2> data;
};

struct Empty {
};

。正如我所料,

sizeof(std::tuple<DByte, Empty, Empty>) = 2

。然而,

sizeof(std::tuple<Empty, DByte, Empty>) = 3
sizeof(std::tuple<Empty, Empty, DByte>) = 3

我不明白为什么最后两种类型的大小不是2(在sizeof(std::byte)==1的平台上

此演示还在Clang和GCC下打印这些类型的内存布局。

为什么以下布局中的所有元组大小不同:

0       1       2
|     DByte     |
| Empty | Empty |

?


共有2个答案

潘飞英
2023-03-14

为什么以下布局中的所有元组大小不同:

他们可能有,这只是一个优化失误。

你可能会在常规课程中看到同样的缺课:

struct A
{
    [[no_unique_address]]DByte m;
    [[no_unique_address]]Empty e1;
    [[no_unique_address]]Empty e2;
};

struct B
{
    [[no_unique_address]]Empty e1;
    [[no_unique_address]]DByte m;
    [[no_unique_address]]Empty e2;
};

struct C
{
    [[no_unique_address]]Empty e1;
    [[no_unique_address]]Empty e2;
    [[no_unique_address]]DByte m;
};

演示

请注意,msvc为您的不同元组演示提供了相同的大小。(总是4,所以没有空类优化)。

未指定元组的布局。所以这些都有可能。

哈襦宗
2023-03-14

为什么以下布局中的所有元组大小不同:

因为 std::tuple 的实现不会根据所包含对象的类型对其子对象重新排序(尽管它们不需要这样做)。它们使用一个顺序,该顺序取决于参数的顺序,但不依赖于这些参数的类型。

通常,标准要求所有子对象都有一个唯一的地址,并且标准布局类的子对象之间可能没有重叠。对于空基类有一个异常1,它们不需要有一个唯一的地址,这个特殊的规则是一些std::元组实现利用的,以使空子对象不使用内存。但是只有当子对象的顺序正确时,异常才能应用。

1C20添加了另一个例外,但标准库在C11中实现了std::tuple,并且在不破坏ABI的情况下实际上无法更改它们的布局,因此这对于std:∶tuple的实现并不重要。如果不对子对象重新排序,C20特性也不会改善优化。

 类似资料:
  • 问题内容: 限制Java JVM上Permgen空间大小的目的是什么?为什么不总是将其设置为等于最大堆大小?Java为什么默认为这么少的64MB?他们是否正在试图通过这种方式迫使人们注意代码中的Permgen问题? 如果我的应用使用85MB的permgen,那么将其设置为96MB可能是安全的,但是如果它只是主堆的一部分,为什么还要设置得如此之小呢?允许JVM使用堆允许的PermGen效率不高吗?

  • 问题内容: 对于Java的处理方式以及涉及到的数字和其他类型的数字,我有些困惑。例如: 输出(也许您应该先猜测一下): 这不能编译是可以预料的,是不同的对象。 令我有些惊讶的是,默认情况下9是an ,并且1)甚至没有编译。请注意,您不能将放入期望使用的方法中,但是在这里它们是相等的。 由于两个相同的原因,这令人惊讶,但似乎更糟。 不足为奇,因为自动装箱到和。 不足为奇,因为不同类中的对象不应该是。

  • 在添加新的键值对时,我有几个关于重建哈希映射的问题。我将根据这些事实提出问题(它们对于Oracle JVM是正确的,不确定它们对于其他JVM是否正确): 每次当HashMap增长大于阈值(阈值=加载因子*条目数)时,Resize将重建HashMap,使其具有更大的内部表数组。新创建的条目放在哪个存储桶中并不重要,Map仍然会变得更大。即使所有条目都进入一个bucket(即它们的键“返回相同的数字)

  • 问题内容: 我正在学习Java 8文档。我知道最大数组大小定义为均值2 ^ 31 – 8 = 2147483639 。然后,我集中讨论了为什么要减去8 或减去? 有些人根据文档给出了一些逻辑。因此,对于标题字,减去8。但是在这种情况下,如果标题字需要大于8,那么答案是什么? 请在此基础上澄清我。预先感谢您的合作。 问题答案: 阅读上述有关Java内存管理的文章,其中清楚指出 我认为这适用于Arra

  • 不懂的问题。我有一个chrome扩展,当它访问一个API时,它会返回一些奇怪的结果。 我认为问题出在从DOM中提取的用户ID上。 这些元素的目的究竟是什么? 为什么它们末尾的一些ID是相同的,而另一些ID却是不同的呢?

  • 问题内容: Java中的数组的长度是固定的。Java为什么要允许大小为0的数组呢? 问题答案: 它表示它为空。即您可以遍历它,就好像它有项目并且没有结果发生一样: 从而避免了检查的需要。如果所讨论的数组为,则会发生异常,但是在这种情况下,它什么也不做,这可能是适当的。