提问者:小点点

从libuv句柄继承


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

我的主要担心是:

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

那么,我可以在C++中安全地从libuv句柄继承吗? 如果你能澄清以上几点,你就会得到额外的分数。


共1个答案

匿名用户

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

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

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

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