压缩的 std::expected

Compressed std::expected

提问人:sh- 提问时间:11/11/2023 更新时间:11/11/2023 访问量:95

问:

std::expected是 C++23 中引入的可区分联合,可以看作是它的泛化,因为它在空时存储错误值。std::optionalstd::optional

现在,我认为许多类型在无效或空时已经有未使用的存储。一个简单的例子是 ,它存储指针和大小。如果指针为 null,则大小没有功能,可以保存错误值。std::span

从理论上讲,这将提供优化 的内存消耗的机会,因为不需要单独存储鉴别器(通常是布尔值)。可以将指针用作鉴别器。std::expected<std::span>

我敢肯定,当与 .std::expected

据推测,这可以通过 的部分模板专用化来利用。如果操作得当,它可能对用户是透明的。内存节省将是自动的,对于满足具有可用作鉴别器的现有成员的标准的所有类型。std::expected

现在我的问题是:标准库在设计时是否考虑了这种优化,是否有利用这种可能性的实现?哪些标准类型适合这种优化?现有的标准库实现是否已经利用了这个机会?

C++ 优化 模板 - 专业化 标准 - 预期

评论

0赞 alter_igel 11/11/2023
std::expected 不会在同一存储中存储任意错误类型吗?在这种情况下,没有值可以检查特殊无效状态
0赞 digito_evo 11/11/2023
"如果指针为 null,则大小没有函数,可以保存错误值。但是,该误差值表示什么?
0赞 sh- 11/11/2023
@digito_evo:错误值的类型为 E,如 的定义中所述,因此表示 E 所表示的任何内容。例如,我只是说 E 的存储可以与 中的大小的存储重叠。std::expectedstd::span
3赞 Red.Wave 11/12/2023
这不是第一次有这个想法。一个问题是通过访问器函数公开目标类的类内部来违反封装,或者仅通过私有/频繁访问提供访问器函数作为公开,这会引起可伸缩性问题。另一个问题是在所有此类类中引入类型双关语,这反过来可能会关闭此类类型的编译时计算。std 的这种修改将永远需要。但是您可以创建并提出替代实现来增强库。
3赞 Red.Wave 11/12/2023
另一点是,视图类型(如 )旨在用作短暂的自动对象;它们不应该存储在动态容器中。那么,一个重要的问题是,这样的优化是否值得麻烦?对执行速度有什么影响?std:: expectedstd::span

答: 暂无答案