当前位置: 首页 > wzjs >正文

怎样做网站啊自己搭建一个网站

怎样做网站啊,自己搭建一个网站,安徽省工程建设安全协会网站,中信建设有限责任公司董事长文章目录 一、C对象注册系统1、基本原理2、注册信息放入特点段2.1、解决注册项分散问题2.2、实现零手动注册2.3、绕过 C 的静态初始化顺序问题2.4、支持动态扩展(如插件系统)2.5、性能与空间优化2.6、总结 3、使用__declspec(selectany) 避免重复定义3.1…

文章目录

  • 一、C++对象注册系统
    • 1、基本原理
    • 2、注册信息放入特点段
      • 2.1、解决注册项分散问题
      • 2.2、实现零手动注册
      • 2.3、绕过 C++ 的静态初始化顺序问题
      • 2.4、支持动态扩展(如插件系统)
      • 2.5、性能与空间优化
      • 2.6、总结
    • 3、使用`__declspec(selectany)` 避免重复定义
      • 3.1、为什么要使用`__declspec(selectany)`?
      • 3.2、`selectany` 的作用
      • 3.3、正确用法示例

前言:

利用Windows平台特有的编译器链接器特性,实现一个完整的对象注册系统。这个对象注册系统的主要作用是实现类的自动注册和按名称创建对象,是一种简化对象工厂模式的实现。

一、C++对象注册系统

1、基本原理

这个系统将利用以下技术:

  • __declspec(allocate) 将注册信息放入特定段
  • __declspec(selectany) 避免重复定义
  • 链接器提供的段遍历能力

2、注册信息放入特点段

将注册信息放入特定内存段(如 CUSTOBJ$__m)的核心目的是实现编译期自动收集分散的注册项,从而构建全局对象注册表。这种设计的关键原因和优势如下:

2.1、解决注册项分散问题

  • 传统工厂模式的缺陷: 需要手动维护一个中心化注册表(例如在 .cpp 中显式调用
    RegisterClass),新增类时必须修改注册代码,违反开闭原则。
  • 特定段的优势:通过将注册项分配到统一段中,链接器会自动收集所有编译单元中的注册信息,无需手动维护注册代码。

2.2、实现零手动注册

  • 自动注册机制:宏 REGISTER_CLASS(MyClass) 在类定义处展开时,会将注册信息(如类名、构造函数)放入特定段。
    // 自动生成并放入 CUSTOBJ$__m 段
    __declspec(allocate("CUSTOBJ$__m")) 
    const ObjectRegistryEntry MyClassEntry = {"MyClass", &CreateMyClass};
    
  • 运行时初始化:程序启动时,注册系统只需遍历该段内容即可获取所有类的注册信息,无需显式调用注册函数。

2.3、绕过 C++ 的静态初始化顺序问题

  • 传统静态变量的风险:若用全局静态变量注册,不同编译单元的初始化顺序不确定,可能导致注册时访问未初始化的依赖。即:注册系统访问全量的全局静态对象时,无法保证这些全局对象都已经初始化。
  • 特定段的解决方案:段内数据由链接器物理排列,注册系统通过遍历段地址(而非依赖静态初始化)获取所有注册项,完全规避初始化顺序问题

2.4、支持动态扩展(如插件系统)

  • 跨模块(DLL)兼容性: 插件只需用相同宏注册类,其注册信息会被放入同名的段中。主程序通过合并所有模块的段内容,自动识别插件中的类
  • 示例流程
    主程序启动 → 扫描所有DLL的 CUSTOBJ$__m 段 → 合并注册表 → 通过类名创建任意模块中的对象
    

2.5、性能与空间优化

  • 高效查询:注册表初始化时,只需一次线性扫描段内存即可构建哈希表,后续对象创建为 O(1) 复杂度。
  • 减少冗余:段机制直接利用编译器/链接器能力,比运行时动态注册(如维护全局 std::map)更节省内存。

这种设计本质上是利用编译器和链接器的能力,在二进制层面实现类似反射的功能。

2.6、总结

  • 自动化:避免手动维护注册逻辑,实现「声明即注册」
  • 确定性:规避静态初始化顺序的不可控性
  • 扩展性:天然支持动态加载的插件架构
  • 高效性:利用链接器原生支持的低成本收集机制

这种模式广泛用于游戏引擎(Unreal的UClass)、序列化框架(Protocol Buffers)等需要动态类型管理的系统。

3、使用__declspec(selectany) 避免重复定义

在基于特定段实现的C++对象注册系统中,__declspec(selectany) 起着关键作用。下面解释下为什么要使用它以及不使用会带来什么问题?

3.1、为什么要使用__declspec(selectany)

当注册宏 REGISTER_CLASS(MyClass) 在头文件中展开时,会在每个包含该头文件的编译单元(.cpp文件)中生成一个 相同的全局注册变量。如果不使用selectany编译会失败,例如:

// MyClass.h
#define REGISTER_CLASS(Class) \__declspec(allocate("MyRegSegment")) \const Registration Class##_entry{ #Class };  // 全局变量!REGISTER_CLASS(MyClass);  // 展开后:每个包含此头文件的.cpp都会生成 MyClass_entry

3.2、selectany 的作用

  • 合并重复定义:告诉链接器:“所有编译单元中看到的这个符号都是相同的,任选一个保留,其他的丢弃”。
  • 避免链接冲突:确保即使多个.cpp文件包含同一头文件,最终程序中也只保留一份注册项。

3.3、正确用法示例

#define REGISTER_CLASS(Class) \__declspec(allocate("MyRegSegment")) \__declspec(selectany) \  // ← 关键!const Registration Class##_entry{ #Class };

使用__declspec(selectany) 是Windows下实现自动化注册系统的经典模式,权衡了简洁性与可靠性。

http://www.dtcms.com/wzjs/219879.html

相关文章:

  • 做热点链接的网站免费好用的crm软件
  • 网站抠图怎么做的b2b免费发布平台
  • 怎样接做网站和软件的活如何制作付费视频网站
  • 2018年静安区品牌网站建设最新网站查询
  • 杭州哪里可以做网站推广青岛关键词网站排名
  • 专门做墓志铭的网站培训机构加盟
  • 自己使用原生php做网站性能长沙官网优化公司
  • 网站子域名查询全国最新疫情最新消息
  • 建设电子商务网站的必要性vue seo优化
  • 政府网站建设规划书软文推广渠道
  • 动态网站建设02章在线测试百度网络小说排行榜
  • 上线了怎么建网站如何在百度发布信息推广
  • 烟台网站建设方案托管合肥百度关键词推广
  • 网站建设项目策划书广告联盟接单赚钱平台
  • 南昌做网站公司搜索引擎推广培训
  • wordpress 米课合肥网站关键词优化公司
  • wordpress用户级别内容不同杭州seo网站
  • wordpress制作rss百度搜索怎么优化
  • 自己做免流网站微信引流推广怎么找平台
  • 公众号多少钱广州seo服务外包
  • 网站整站模板下载我想开个网站平台怎么开呢
  • 门户网站意义重庆网站优化软件
  • wordpress toggle 插件seo收索引擎优化
  • 新闻资讯网站怎么做上海百度seo公司
  • 自己做壁纸的网站长沙好的seo外包公司
  • 做网站有什么专业术语爱战网关键词
  • 网站登录页面模板哪家公司网站做得好
  • 淘宝网站建设策划书长沙网站搭建优化
  • dhru商城网站建设模板建站优点
  • 昆明优化官网服务seo优化诊断工具