继承自 libuv 句柄

Inheriting from libuv handles

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

我的主要顾虑是:

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

那么,我可以在 C++ 中安全地继承 libuv 句柄吗?如果您也能弄清以上几点,加分。

如果您是自己分配句柄然后将它们传递给 libuv 的人,那么没有什么可以阻止您继承它们。您可以随心所欲地分配它们。您可以让他们成为您 class 的成员,但您也可以让他们成为您 class.

的基础

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

由于编译器无法更改内存布局,因此无论 libuv 做什么都是无关紧要的。如果它与普通的 libuv 句柄对象一起工作,当它们用作基础时它仍然可以工作 class.

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