gpt4 book ai didi

c++ - 一个类是否需要是标准布局类型才能确定其成员的内存偏移量?

转载 作者:行者123 更新时间:2023-11-30 05:42:55 27 4
gpt4 key购买 nike

假设我想写一个侵入式列表。我有一个侵入式列表类模板,它采用类型和指向成员的指针用作节点。它看起来大致是这样的:

// This needs to be a member of anything the intrusive list is going to store.
class IntrusiveListNode {
// ...
}

// The intrusive list itself
template <class T, IntrusiveListNode T::*Member>
class IntrusiveList {
// ...
};

// This is a type that is going to be stored in an intrusive list.
class IntegerListNode {
public:
IntrusiveListNode node;

private:
int value;
};

// An example of the how the list would be used.
IntrusiveList<IntegerListNode, &IntegerListNode::node> myList;

您要存储在列表中的每个东西都有一个 IntrusiveListNode。要将该 IntrusiveListNode 变回您可以使用的东西,例如 IntegerListNode,您可以调用一个函数,该函数根据节点在类中的偏移量在节点上执行一些指针运算,然后将其转换为适当的类型。这似乎有效,但我认为不能保证有效。

我希望能够在我的类中添加一个 static_assert,它可以在编译时验证您使用的类型是否安全,但我不确定 static_assert 的条件是什么。我认为这只有在持有 IntrusiveListNode 的类型是标准布局类时才能保证有效,但我不确定,因为标准布局类型的要求似乎比我实际需要的更严格。

特别是,标准布局类型要求所有成员具有相同的访问控制。我需要的是能够确保指针算法能够工作。这意味着你不能在多态类型上使用它,因为结构的两个不同版本可能有不同的布局,但如果该类型混合了私有(private)和公共(public)数据成员,这应该不是问题,对吧?如果我只要求类型是非多态的,会安全吗?或者有更好的检查吗?还是我一直在做 is_standard_layout 检查?

最佳答案

我不能在这方面引用标准(而且我很确定这是未定义的行为领域),但您通常可以依赖数据成员相对于指向包含类的指针的偏移量的一致性,前提是该指针的静态类型是常量(在您的情况下为 IntegerListNode*)。

您可能会发现偏移量在相对于指向派生类型的指针进行测量时会发生变化,但只要您总是先将 reinterpret_cast 重新解释为 IntegerListNode,然后在需要时才静态/动态转换为派生类型,我几乎会觉得舒服:)

这并不是说这是个好主意。实现侵入式列表不需要这样的指针算法。如果您只是在 IntegerListNode 中定义一个“下一个”和/或“上一个”指针(指向一个 IntegerListNode),您可以将指向成员的指针传递给 IntrusiveList,并且永远不需要进行创造性的转换:)

关于c++ - 一个类是否需要是标准布局类型才能确定其成员的内存偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30449902/

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