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

网站建设功能列表医疗网络营销外包

网站建设功能列表,医疗网络营销外包,什么自己做网站吗,wordpress 外框前言 在 googletest的源码中#xff0c;看到gtest-matchers.h 中实现的MatcherBase 类自定义了一个 VTable#xff0c;这种设计实现了一种类似于C虚函数的机制。C中的虚函数机制实质上就是通过这种方式实现的#xff0c;本文用c语言自定义虚函数表VTable实现了一下virtual的…前言 在 googletest的源码中看到gtest-matchers.h 中实现的MatcherBase 类自定义了一个 VTable这种设计实现了一种类似于C虚函数的机制。C中的虚函数机制实质上就是通过这种方式实现的本文用c语言自定义虚函数表VTable实现了一下virtual的功能来深刻理解其机制。我们通过创建存储函数指针的结构体来模拟这种行为。 C的运行时多态 如果我们在C中有一个抽象基类 Shape 定义了纯虚函数GetArea() 用于计算面积。对于不同的派生于 Shape 的类面积计算方法会不一样。比如对于圆形 Circle类是 Shape 的一种其特有属性为半径r面积计算公式为 π·r² 对于正方形 Square类其特有属性为边长d其面积计算公式为 d² 。 基类Shape 的定义如下 class Shape { public:virtual double GetArea()0; };派生类Circle 继承于 Shape定义如下 class Circle: public Shape { public:Circle(double r)radius(r){}double GetArea() override {return radius * radius * 3.14;} private:double radius; };通过基类指针指向不同派生类对象去调用同一个方法可以实现多态如下所示 Shape* shape new CirCle(5); shape-GetArea();那么 virtual 实现多态的底层原理是什么呢 用C语言简单实现virtual的底层原理 用C语言模拟实现以上C代码。首先定义一个存储函数指针的结构体VTable作为 Shape类的虚函数表 其中定义了两个函数指针 分别指向该类计算面积的函数和析构函数只要目标函数的参数列表和返回类型与函数指针定义相同其中void*相当于this指针 struct VTable{double (*GetArea)(void*);void (*Destructor)(void*); };然后定义一个基类Shape的结构体其中包含了一个指向虚函数表VTable 的指针 struct Shape{VTable* vtable; };在派生类 Circle 中添加了额外的字段 radius并且包含一个基类的实例通过这种方式实现继承 struct Circle{Shape base;double radius; };然后定义一个函数GetArea作为公共调用接口该函数接收一个Shape指针作为参数并通过其指向类的虚函数表调用它的面积计算方法 double GetArea(Shape* shape){return shape-vtable-GetArea(shape); }对于Circle类中的面积计算方法实现如下 double GetCircleArea(void* obj){Circle* circle (Circle*)obj;return 3.14 * circle-radius * circle-radius; }最后在程序中初始化Circle类的虚函数表 circle_vtable 设置GetArea函数和析构函数分配一块Circle对象大小的内存将它的vtable绑定到circle_vtable 初始化radius的值并通过Shape类型的指针指向Circle对象调用虚表中的方法 VTable circle_vtable {GetCircleArea,CircleDestructor};Circle* circle (Circle*)malloc(sizeof(Circle)); circle-base.vtable circle_vtable; circle-radius 5;Shape* shape (Shape*)circle; printf(Area of circle: %f\n, GetArea(shape)); ShapeDestructor(shape);输出为 Area of circle: 78.500000对于Square 类也是类似的实现。类设计如下图所示 完整测试程序地址https://compiler-explorer.com/z/zbGh7dsh4 自定义VTable的好处 通过virtual实现多态绝大多数时候都够了那为什么googletest库中要自定义VTable呢以下是一些好处供参考学习一下库开发者的思考角度。 更好的性能 C的虚函数机制虽然方便但是它在某些情况下会带来性能开销。例如虚函数表的查找需要额外的时间并且每个对象都需要一个指向虚表的指针这会增加内存的开销。通过自定义的VTable机制googletest 可以更好地控制这些开销可能减少间接调用的开销提高性能。 灵活的内存管理 使用自定义的VTable可以更灵活地管理内存。例如可以将VTable实例放置在特定的内存区域或共享多个对象之间从而减少内存占用。这种方式也可以使得一些轻量级对象不需要包含虚表指针从而减小对象的大小。 跨编译器兼容性 不同的编译器和编译器版本对虚函数的实现可能略有不同这会导致跨编译器的兼容性问题。通过自定义的VTable机制googletest 可以避免依赖编译器的实现细节保证在不同编译器和平台上的一致行为。 类型擦除和多态性 自定义的VTable机制可以实现类型擦除和更灵活的多态性。它允许将不同类型的对象统一处理而不需要它们共享一个公共的基类。这对于模板编程和泛型编程非常有用因为可以实现基于模板的多态而不需要依赖继承。 更好的调试和测试 自定义的VTable可以在调试和测试中提供更多的信息。例如可以在VTable中包含额外的调试信息或断言以帮助发现和诊断问题。这种灵活性在某些情况下是C内置的虚函数机制所无法提供的。 总结 这个例子的实现对很多问题还没有考虑到不过我认为它已经通过C语言基本展示了C虚函数的原理。理解以上过程后再去重新思考以下问题可能会更清晰。 C virtual运行时多态的实现原理派生类重写虚函数生效的条件是什么一个仅有虚析构函数的类大小为多少纯虚函数0是什么含义虚函数为什么会稍慢些其开销有哪些为什么构造函数不能是虚函数而析构函数通常需要是虚函数 参考 https://github.com/google/googletest/blob/1d17ea141d2c11b8917d2c7d029f1c4e2b9769b2/googletest/include/gtest/gtest-matchers.h#L316https://stackoverflow.com/questions/78655663/why-does-matcherbase-class-in-gtest-matchers-h-define-a-vtable-and-what-is-its 如果你觉得本文对你有帮助请点个赞鼓励我持续创作关注我一起持续进步 公众号七昂的技术之旅 关注公众号送你一份C系列电子书。
http://www.zqtcl.cn/news/424479/

相关文章:

  • 成都平台网站建设公司邯郸网络科技公司
  • 热门课程自己做网站大型购物网站建站
  • apache 创建网站重庆建站模板
  • 手机怎么制作网站叶县建设局网站
  • 怎么做后台网站一键更新搜索引擎优化的主要策略
  • 站酷网免费素材图库官网国外域名购买
  • 石家庄个人谁做网站天体摄影
  • 徐州集团网站建设网站排名快速提升工具
  • 自己创业做原公司一样的网站做网站要学会什么语言
  • 宿州高端网站建设公司网络业务
  • 做多语言版本网站网站收录低
  • 鼎湖网站建设江门网站优化快速排名
  • 做交通事故的网站北京物联网app开发公司
  • 网站建设中 页面网络培训注册会计师
  • app网站如何做推广安装wordpress错误
  • 八零婚纱摄影工作室网站南昌微信营销公司
  • 海南网站开发公司百度网站建设费用怎么做账
  • 做网站的研究生专业微信公众号推广的方法
  • sql网站开发数据库连接失败wordpress改全屏
  • 做外贸怎么上国外网站网上注册公司流程图文
  • 网站开发 慕课厦门建设局网站技司学校
  • 中山自助建站系统多个网站能否统一做等保
  • 做网站怎么别人搜不出来电商购物网站开发需求分析
  • 教育网站设计用模板做的网站不好优化
  • php网站api接口写法中国做铁塔的公司网站
  • 做博客网站如何盈利wordpress百家号
  • 读经典做临床报名网站cnzz 网站跳出率查询
  • 青岛网站建设网站广东手机网站制作公司
  • 个人免费建站软件影视传媒网站源码
  • 网站软件下载app如何做国外网站