【发布时间】:2020-07-23 12:28:33
【问题描述】:
libuv 句柄有一个void* data 字段来携带任何上下文信息(C 语言中回调的标准模式)。但是,由于我在 C++ 领域工作,我想使用继承直接将上下文存储在句柄中。主要优点是存储多个上下文项,IIUC 需要堆分配以将它们“组合”成单个指针,例如 std::tuple<...>* 或一些临时结构(如果我在这里错了,请纠正我,即使在C-土地)。
我的主要担心是:
- 指向句柄的指针最终在 C-land(libuv 库)中使用。不确定此处是否存在任何与互操作相关的极端情况。
- libuv 有自己的伪继承系统,通过在子级中重复来自父级的字段。这似乎类似于编译器如何在派生类中布置基类的字段。不确定这将如何与 C++ 继承交互。
- 根据我的研究,该标准并没有真正定义任何用于继承的内存布局,这取决于编译器。不确定这是否会影响事情。
那么,我可以在 C++ 中安全地继承 libuv 句柄吗?如果您也能澄清以上几点,则可以加分。
【问题讨论】:
-
libuv 分配句柄还是你分配句柄?
-
我自己分配了一个
new。如果 libuv 做到了(假设),我猜继承不会起作用,因为没有可用于任何派生类字段的内存。