设计模式——在c++中,当实现(一组单例)直接从它们的编译单元在某个注册表中自注册时,它被称为什么?
design patterns - What is it called when implementations (of a group of singletons) self-register in some registry directly from their compilation unit in C++?
假设我们有这样的方案:
qqqapi.h:
int register_qqq(Qqq* klass);
qqqalpha.cpp:
QqqAlpha::QqqAlpha(...) : Qqq(...) { }
QqqAlpha instance;
int dummy = register_qqq(&instance);
qqqbeta.cpp:
QqqBeta::QqqBeta(...) : Qqq(...) { }
QqqBeta instance;
int dummy = register_qqq(&instance);
通过这种方式,您可以通过复制源文件和头文件,更改适当的标识符来创建新的qqq类型。不需要手动添加任何东西到任何列表
这个模式怎么叫?对于如何正确地实施这些事情,有什么建议吗?
这个方案的一个主要问题是c++实现处理整个翻译单元。
考虑一个包含数百个翻译单元的静态库。就编译器和链接器所知,您的程序只使用了一两个。他们几乎不知道,通过在注册表对象中自动注册的方式,您的程序实际上使用了五个单元!
因此,链接器删除了库提供的所有翻译单元,除了代码直接使用的一两个翻译单元,例如通过调用函数或引用变量。
结果:神秘的运行时失败,其中单例注册表不包含它应该包含的内容。
这可能是模式/习语/whatchammacallit很少使用的原因。它适用于目标代码文件,因为这样你就显式地告诉链接器要包含什么。对于静态库,它的效果就不那么好了。
最佳实践是确保,最好通过代码,但可能通过文档,从翻译单元调用或引用的东西,例如由main
。
我不知道它有什么常用的名称。在过去,在另一种语言中,有一种叫做模块信封的东西,您可以将其视为负责模块初始化和清理的静态对象的构造函数和析构函数的执行。但是c++不支持这一点,而且据我回忆,最近几年在谷歌上搜索这个术语并没有提供任何相关的结果;就像所有关于它的信息都消失了…
相关文章:
- 有没有任务栏API可以立即应用注册表更改
- 检查注册表项是否链接到(或副本)另一个注册表项
- 禁用地址共享注册表不起作用
- 如何从注册表项中提取配置单元和注册表名称
- 注册表正在设置 1 个字符
- 清理"QSettings"注册表项的最佳方法(Windows上的Qt 5)
- 在 c++ 中编辑注册表项
- 某些进程的注册表限制
- 在编译时生成某种子类/类型注册表?
- 如何测试注册表项是否存在?
- 注册表-获取值(而不是键)上次更改的时间和键创建日期
- 从注册表中检索已注销用户的 sid
- 如何正确检查 c++ 是否存在注册表项?
- 如何在不使用任何数据库的情况下制作动态注册表单?
- 强制资源管理器重新加载注册表值
- 以编程方式锁定注册表项以避免并发问题
- 如何应用注册表模式使"select class depend on input"遵守开放封闭原则?
- 如何恢复注册表项的有效权限?C++
- 如何防止 C API 注册表中的 Lua 回调被垃圾回收?
- 设计模式——在c++中,当实现(一组单例)直接从它们的编译单元在某个注册表中自注册时,它被称为什么?