c++ - 从 libuv 句柄继承
问题描述
libuv 句柄有一个void* data
字段来携带任何上下文信息(C-land 中回调的相当标准的模式)。但是,由于我在 C++ 领域工作,我想使用继承直接将上下文存储在句柄中。主要优点是存储多个上下文项,IIUC 需要堆分配以将它们“组合”成一个指针,例如,std::tuple<...>*
或一些临时结构(如果我在这里错了,请纠正我,即使在 C-land 中我也可以避免堆分配)。
我的主要担心是:
- 指向句柄的指针最终在 C-land(libuv 库)中使用。不确定此处是否有任何与互操作相关的极端情况。
- libuv 有自己的伪继承系统,通过在子级中重复来自父母的字段。这似乎类似于编译器如何在派生类中布置基类的字段。不确定这将如何与 C++ 继承交互。
- 根据我的研究,该标准并没有真正定义任何用于继承的内存布局,这取决于编译器。不确定这是否会影响事情。
那么,我可以在 C++ 中安全地继承 libuv 句柄吗?如果您也可以阐明上述要点,则可以加分。
解决方案
如果您是自己分配句柄然后将它们传递给 libuv 的人,那么没有什么能阻止您继承它们。您可以随意分配它们。你可以让他们成为你班级的成员,但你也可以让他们成为你班级的基础。
编译器不允许仅仅因为它是一个基类就改变 libuv 句柄的内存布局。允许决定基在整个类结构中的位置,但不允许更改基本身。(否则,指向基类的指针必须以不同的方式工作,具体取决于您分配的是基类的实例还是派生类的实例!)
由于编译器不能改变内存布局,所以无论 libuv 做什么都是无关紧要的。如果它与普通的 libuv 句柄对象一起工作,那么当它们用作基类时它仍然可以工作。
注意:如果从 libuv 继承句柄仍然让您感到不舒服,您可以将句柄分配为类的成员,并将指向整个类的指针存储在 libuv 的“上下文”字段中。
推荐阅读
- angularjs - Yarn + Lerna + Angular Libs = 出版失败?
- c++ - 递归函数的 Matlab 代码生成
- javascript - Javascript 只能访问 Ajax 之后的一些新 DOM 有什么原因吗?
- asp.net-core - 在 ASP.NET Core Startup.cs 中访问当前用户
- visual-studio-code - Vscode 没有在面板中显示问题选项卡
- java - 将两个 Double 相除并将 Double 商乘以 Int 时如何将 Double 转换为 Int?
- jsonschema - JSON Schema - 在引用的 Json 中使用条件逻辑
- python - 评论没有在我的 Django Python 网站上打印出来
- c++ - 如何将 C++ 代码拆分为正文和头文件(寻找更具体的示例)
- html - 在描述 Microsoft Azure DevOps API 时提及用户