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

网站公司未来计划ppt怎么做靠谱的免费建站

网站公司未来计划ppt怎么做,靠谱的免费建站,漳州企业网站建设制作,个人微信小程序免费制作一、虚函数性能 一般来说,面向对象的设计中,继承和多态是其中两个非常重要的特征。从使用的过程来看,一般应用到继承的,使用多态的可能性就非常大。而多态的实现有很多种, 但开发者通常认为的多态(动多态&…

一、虚函数性能

一般来说,面向对象的设计中,继承和多态是其中两个非常重要的特征。从使用的过程来看,一般应用到继承的,使用多态的可能性就非常大。而多态的实现有很多种,
但开发者通常认为的多态(动多态)一般是指通过虚函数来实现的多态。
虚函数的不同于普通函数,它会通过一个虚表来控制函数的二次跳转或者叫做重定向。在普通的认知里,虚函数这个特征一般是无法进行诸如内联等进行优化的。所以一谈到虚函数都会认为其性能堪忧。
但在前面的分析中也知道了,什么东西都有特殊情况。但无论如何说明,在常识里,虚函数就是要比普通函数的性能要低。那么到底虚函数性能为什么会低?是不是所有情况下都低?下面进行一下分析。

二、用例子看问题

先看对比的例子:

#include <iostream>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <chrono>
class Parent
{
public:virtual double exeReadDataV(double a, int b){return std::sqrt(a) * std::sin(b);}double exeReadData(double a, int b){return  std::sqrt(a) * std::sin(b);}
};int main()
{Parent* p = new Parent();double a = 3.14f;int b = 3;double sum = 0.f;auto t1 = std::chrono::steady_clock::now();for (int num = 0; num < 100000000; num++){//使用一个定值,一个动态值sum += p->exeReadDataV(a,num);//全是定值//sum += p->exeReadDataV(a, b);}auto t2 = std::chrono::steady_clock::now();auto escape1 = t2 - t1;std::cerr << "escape1 is:" << escape1.count() << std::endl;auto t3 = std::chrono::steady_clock::now();for (int num = 0; num < 100000000; num++){sum += p->exeReadData(a,num);//sum += p->exeReadData(a, b);}auto t4 = std::chrono::steady_clock::now();auto escape2 = t4 - t3;std::cerr << "escape2 is:" << escape2.count() << std::endl;return 0;
}

执行结果:

escape1 is:1982749665
escape2 is:1850111712

从上面的执行可以看到,两者的执行基本没区别。这可能打破了不少人的感官认知。无论哪种函数,决定性能的有两个重要环节:一个是调用的开销;另外一个是确定性调用。前者比较好理解,后者则不容易弄明白。其实可以这样理解,一个写代码要尽量降低调用的开销,一个是写出的代码编译器能更准确的知晓上下文,然后进行优化。在前者确定的情况下,后者就非常重要了。而虚函数被大多数人认为性能低的主要原因就在于后者。
虚函数需要一个虚表进行跳转,在内存中这种开销与函数的功能开销相对来说可以忽略。但这种跳转本身意味着大量的未知,而未知就意味着编译无法掌控更多的确定性,而对某些很简单的优化可能都无法进行。正如早期的编译器,在for循环中,直接给一个变量和一个表达式,效率差不少就是这个原因。而后的编译器则对此进行了优化,将其直接转成一个常量值。把上面的例子中注释部分打开并注释当前的执行(即两个参数都为定值的情况):

执行结果:

escape1 is:867604532
escape2 is:100431290

在执行的函数调用中,两个参数中一个为定值,一个为变量时,是否调用虚函数或者普通函数,基本运行是差不多的。但是一旦调用的都为定值时,此时普通函数可以直接将两个计算函数std::sqrt(a) 和 std::sin(b)均优化为固定值并只计算一次。此时再看,计算结果可就差了将一个量级了。
而在前面的文章中(“内联补遗”)分析过的虚函数可以内联,恰恰是那种可以明确确定的虚拟函数,可以内联。即编译器知道虚函数不具有多态性的情况下,它可普通函数没有什么区别。把原来的例子拿上来:

class A{
public:inline virtual void Test(){...}
};
class B:public A
{
public:inline  virtual void Test(){...}
};
inline void Get(A& a){a.Test();
}
int main(){A a;B b;b.Test();//可以内联//下面不确定Get(b);Get(a);
return 0;
}

那么可以从内联的角度来分析,虚函数为什么会给大家一个性能低的印象?首先为什么内联函数快,主要就是固定地址,编译器优化两大方面。而上面的虚拟函数可以内联,仿佛是与此结论相反,但恰恰提到了能够内联的虚拟函数的情形。互相印证,应该就明白为什么虚函数在多态的情况下性能低的原因了。
总之,虚函数本身不是性能低的代表,但是虚函数多态的调用会影响优化才是性能降低的根源。这些优化包括计算优化、分支跳转优化以及调用优化等等。而这些优化无法被编译器使用,自然也就会使得编译出来的代码有着很多的多余的运行指令。

三、设计上对虚函数数的替代

如果对性能的敏感性不强,那么如何使用虚函数不是一个多大的问题。可是如果实际情况对此要求比较严格时,可以考虑用如下的方式来解决虚函数的使用问题:
1、模板的方法如CRTP(奇异递归)
2、使用宏(不推荐)
3、通过设计模式等设计方法实现(如访问者模式等 )
4、使用一些技术或方法绕开多态,比如就直接写多个类然后直接控制
到底如何使用或不使用虚函数,是根据实际情况来决定的。还是那句话,没有一个技术是包打天下的。

四、总结

学习知识不是简单的为了会用,而是能够灵活的运用。要想灵活的运用,则必须掌握技术本质的内涵。只有把其内在体系掌握,才能在具体的场景上发挥其优势。这也是总说的从必然世界到自由世界的一个哲学问题。

http://www.yidumall.com/news/40191.html

相关文章:

  • 哪个网站做加盟在哪里推广比较好
  • 威海外贸网站建设联系方式茶叶seo网站推广与优化方案
  • 哪个网站做海报比较好网站建设策划方案
  • 做百度网站的公司哪家好seo下载站
  • 个人站长做电音网站网站开发与设计
  • 登录app广州做seo整站优化公司
  • 网站建设网站合同版本seo网站推广实例
  • 学习php做毕设网站方向免费站推广网站不用下载
  • 怎么做链接网站百度seo费用
  • 网站设计标准百度关键词优化曝光行者seo
  • 哪些公司经常做网站百度企业查询
  • 中山网站优化怎么做蛋糕
  • 制作充值网站深圳网络推广营销公司
  • 网站公司建设 中山网站页面的优化
  • 可以自己做网站大型seo公司
  • 专业做京东网站吗杭州seo博客
  • 京东网站建设目的企业seo排名
  • 网站做兼容处理怎么网络营销首先要
  • dedecms插件成都网站优化及推广
  • 手机网站返回顶部代码推广页面
  • 个人空间网站免费外贸网站都有哪些
  • 找最新游戏做视频网站头条今日头条
  • 动态网站的主要特点b站广告投放平台入口
  • 网站建设能干什么站长工具免费
  • 写字就能赚钱做网站极速一区二区三区精品
  • 国外的响应式网站模板餐饮营销引流都有什么方法
  • 最新企业网站系统深圳市企业网站seo营销工具
  • php做企业网站软文范例大全500字
  • 公司有网站域名后如何建网站企业网站优化报告
  • 四川做网站设计哪家好谷歌app下载 安卓