c++ - std::tuple 中的空类

标签 c++ tuples language-lawyer sizeof

The size of any object or member subobject is required to be at least 1 even if the type is an empty class type [...], in order to be able to guarantee that the addresses of distinct objects of the same type are always distinct.

<子> cppreference quote

这个我就知道了。我刚发现的是一些库类型,如 std::tuple 不使用任何大小来包含空类。这是真的?如果是,那怎么样?


编辑:在阅读了@bolov 对他的回答的最后注释后,我还有一个问题:因为EmptyPOD 所以memcpy 是安全的它。但是,如果您将 memcpy 到一个“幻影”地址(请参阅@bolov 的回答),您将有效地写入 int 元素(sizoef(Empty) 为 1)。这似乎不太对。

最佳答案

对象 的大小必须大于零。 子对象 的大小没有该限制。这导致了空基优化 (EBO),其中空基类不占用空间(编译器在将近 20 年前开始实现)。而这反过来又导致将 std::tuple 通常实现为继承链,其中空基类不占用空间。

关于c++ - std::tuple 中的空类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39039458/

相关文章:

c++ - 理解 C++ 函数指针在 HIP 中通过引用传递

c# - 返回包含两个数组的元组

c++ - 在没有 std::launder 的情况下将 std::aligned_storage* 重新解释为 T* 是否违反严格别名规则?

c++ - 也许我对 [class.access]/7 的理解不正确,但是

c++ - 消除运行时错误 (SIGSEGV)

c++ - 类地址与值地址不同?

c++ - 如何解析UTF-8中文字符串

python - 为什么 python 在元组设计中选择逗号而不是括号?

database - 就 DBMS 而言,元组和记录与文件、页面和 block 之间有什么区别?

c++ - 即使构造函数具有可观察到的副作用,标准中是否允许消除未使用对象的构造?