gpt4 book ai didi

c++ - std::array 的这个 union 的公共(public)初始序列有问题吗?

转载 作者:行者123 更新时间:2023-12-03 23:40:15 24 4
gpt4 key购买 nike

对 Guillaume Racicot 的评论感到困惑 here . common initial sequence有问题吗在这里与否?至少对于 GCC 10.1 x86-64 ( -O3 --std=c++20 -pedantic -Wall -Werror ) 我写 .words并阅读 .bytes .sizeof(MyUnion)==32也让人放心。

union MyUnion {
static constexpr std::size_t size = 32;

using byte = std::uint8_t;
using word = std::uint32_t;

std::array<byte, size> bytes;
std::array<word, size / sizeof(word)> words;
};
static_assert(sizeof(MyUnion)==32);

最佳答案

标准 说:

[array.overview]

... An array is a contiguous container. ...

An array is an aggregate that can be list-initialized with up to N elements whose types are convertible to T.

array<T, N> is a structural type if T is a structural type.


该标准没有明确说明哪些成员 std::array拥有。因此,我们在技术上不能假设它具有任何类型的共同初始序列。
根据 std::array 上显示的要求我们可以合理地假设它有一个 T[N] 类型的成员。 .如果这个假设是正确的,我们来探讨一下是否存在一个共同的初始序列。

[class.mem.general]

The common initial sequence of two standard-layout struct ([class.prop]) types is the longest sequence of non-static data members and bit-fields in declaration order, starting with the first such entity in each of the structs, such that corresponding entities have layout-compatible types, ...


[basic.types.general]

Two types cv1 T1 and cv2 T2 are layout-compatible types if T1 and T2 are the same type, layout-compatible enumerations, or layout-compatible standard-layout class types.

std::uint8_t[32]std::uint32_t[8]不是同一类型(忽略 cv 限定符),它们也不是枚举或类。因此它们不是布局兼容的类型,因此它们不能是相同的公共(public)初始序列的一部分。
结论:不,我们是否可以安全地假设 std::array 的成员没有共同的初始序列。或不。

I write .words and read .bytes


程序的行为是未定义的。
鉴于您想将其读取为(无符号)字符数组,重新解释而不是 union 双关语是安全的:
static constexpr std::size_t size = 32;
using word = std::uint32_t;
std::array<word, size / sizeof(word)> words {
1, 2, 3, 4,
};
std::uint8_t* bytes = reinterpret_cast<std::uint8_t*>(words.data());
而且,如果你想要一个范围:
std::span<std::uint8_t, size> bytes_range {
bytes, bytes + size,
};

关于c++ - std::array 的这个 union 的公共(public)初始序列有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66091817/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com