c++ - is_standard_layout 有什么用?

标签 c++ c++11 standard-layout

据我了解,标准布局允许三件事:

  • 空基类优化
  • 通过某些指针转换向后兼容 C
  • offsetof的使用

现在,库中包含 is_standard_layout 谓词元函数,但我看不到它在泛型代码中的用处很大,因为我上面列出的那些 C 功能似乎极少需要在泛型中检查代码。我唯一能想到的就是在 static_assert 中使用它,但这只是为了让代码更健壮,并不是必需的。

is_standard_layout 有什么用处?有没有什么东西没有它是不可能的,因此在标准库中需要它?

最佳答案

一般 react

这是一种验证假设的方法。如果不是这种情况,您不会想编写假定标准布局的代码。

C++11 提供了一堆这样的实用程序。它们对于编写通用代码(模板)特别有值(value),否则您必须相信客户端代码不会犯任何错误。


is_standard_layout

特有的注释

在我看来,is_pod 的(伪代码)定义大致是...

// note: applied recursively to all members
bool is_pod(T) { return is_standard_layout(T) && is_trivial(T); }

因此,您需要了解 is_standard_layout 才能实现 is_pod。鉴于此,我们不妨公开 is_standard_layout 作为库开发人员可用的工具。另请注意:如果您有 is_pod 的用例,您可能需要考虑 is_standard_layout 在这种情况下实际上可能是更好(更准确)的选择,因为 POD 本质上是标准布局的子集。

我觉得他们添加了所有可以想象的类型评估变体,不管有什么明显的值(value),以防万一有人在下一个标准出现之前的某个时候遇到需要。我怀疑堆积这些“额外”类型属性是否会给编译器开发人员增加显着的额外负担。

这里对标准布局进行了很好的讨论:Why is C++11's POD "standard layout" definition the way it is? cppreference.com 上也有很多很好的细节:Non-static data members

关于c++ - is_standard_layout 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15994237/

相关文章:

c++ - 配置要包含在 C++ 测试中的库

c++11 - std::uint32_t 不是 c++11 中的类型

c++ - unordered_map的默认构造函数,bool类型会被设置为false?

c++ - 使用基于范围的 for 迭代图的边缘

c++ - 使用标准布局类型与其他语言进行通信

c++ - 我写了一个 if/elseif 语句,但它只给了我第一个答案,为什么?

c++ - 文件之间的前向声明

c++ - STL 容器有任何标准布局保证吗?

c++ - 共享对象取决于代码中的符号动态链接吗?

c++ - C++11 中类型的逐字节拷贝?