首页 > 解决方案 > 从 libuv 句柄继承

问题描述

libuv 句柄有一个void* data字段来携带任何上下文信息(C-land 中回调的相当标准的模式)。但是,由于我在 C++ 领域工作,我想使用继承直接将上下文存储在句柄中。主要优点是存储多个上下文项,IIUC 需要堆分配以将它们“组合”成一个指针,例如,std::tuple<...>*或一些临时结构(如果我在这里错了,请纠正我,即使在 C-land 中我也可以避免堆分配)。

我的主要担心是:

  1. 指向句柄的指针最终在 C-land(libuv 库)中使用。不确定此处是否有任何与互操作相关的极端情况。
  2. libuv 有自己的伪继承系统,通过在子级中重复来自父母的字段。这似乎类似于编译器如何在派生类中布置基类的字段。不确定这将如何与 C++ 继承交互。
  3. 根据我的研究,该标准并没有真正定义任何用于继承的内存布局,这取决于编译器。不确定这是否会影响事情。

那么,我可以在 C++ 中安全地继承 libuv 句柄吗?如果您也可以阐明上述要点,则可以加分。

标签: c++clibuv

解决方案


如果您是自己分配句柄然后将它们传递给 libuv 的人,那么没有什么能阻止您继承它们。您可以随意分配它们。你可以让他们成为你班级的成员,但你也可以让他们成为你班级的基础。

编译器不允许仅仅因为它是一个基类就改变 libuv 句柄的内存布局。允许决定基整个类结构中的位置,但不允许更改基本身。(否则,指向基类的指针必须以不同的方式工作,具体取决于您分配的是基类的实例还是派生类的实例!)

由于编译器不能改变内存布局,所以无论 libuv 做什么都是无关紧要的。如果它与普通的 libuv 句柄对象一起工作,那么当它们用作基类时它仍然可以工作。

注意:如果从 libuv 继承句柄仍然让您感到不舒服,您可以将句柄分配为类的成员,并将指向整个类的指针存储在 libuv 的“上下文”字段中。


推荐阅读