当前位置:首页 > 数码 > 程序效率提升之旅-开启C-深入探究虚函数优化 (程序效率提升怎么算)

程序效率提升之旅-开启C-深入探究虚函数优化 (程序效率提升怎么算)

admin3个月前 (04-28)数码28

概述

虚函数优化是一种在编程语言中(例如 C++)使用虚函数调用的优化技术。虚函数调用会引入开销,因为需要在虚函数表 (vtable) 中查找以确定要调用的实际函数。虚函数优化旨在通过将虚函数调用替换为直接调用适当的函数来消除或减少这种开销。

类型推断

一种基本的虚函数优化形式称为类型推断。此技术涉及在运行时推断对象的类型,并根据推断的类型进行直接调用相应的函数。如果推断正确,函数调用将在编译时解析,无需进行虚函数表查找。如果推断错误,将使用回退机制来处理,例如回退到原始的虚函数调用。

类型推断可以使用多种技术来实现。一种常见的方法是类层次分析。此技术在编译时分析类层次结构,以确定给定对象可能具有的类型。通过使用这些信息,编译器可以生成代码来推断对象的类型,并直接调用适当的函数。

基于性能指导的优化

另一种用于虚函数优化的技术是基于性能指导的优化 (PGO)。PGO 涉及在程序执行期间收集运行时分析信息,并使用该信息来指导优化过程。通过分析分析数据,编译器可以识别频繁执行的虚函数调用,并通过虚函数优化来优化它们。

PGO 的工作原理是通过对程序进行插装来收集分析信息,例如虚函数调用的频率和涉及的对象类型。使用这些信息来指导优化过程,编译器可以根据频率和涉及的类型对哪些虚函数调用进行虚函数优化做出明智的决策。

优点

虚函数优化可以显著提高大量使用虚函数调用的程序的性能。通过消除或减少虚函数表查找的开销,可以减少程序的执行时间,从而实现更快、更高效的代码。

程序效率提升之旅

谨慎使用

需要注意的是,虚函数优化并不总是有益的。在某些情况下,虚函数调用的动态特性对程序的正确性或灵活性是必要的。在应用虚函数优化时,应该谨慎使用,考虑性能和程序正确性之间的权衡。

总结

虚函数优化是一种基本的技术,用于优化编程语言(如 C++)中的虚函数调用。通过基于类型推断或分析信息来替换虚函数调用,可以减少或消除虚函数表查找的开销,从而提高程序的性能。在应用虚函数优化技术时,需要仔细考虑权衡和对程序正确性的潜在影响。


为什么C比C++效率高?

并不是所有的C++程序都会比C程序底,只有在你使用了虚函数,等虚拟机制中,才会影响效率,在类的继承中,会增加虚拟列表,增加额外的空间开销,所以有损效率。 但是很明显的,这些机制增加了程序的开发效率,等价交换啊,呵呵。

请问C/C++是什么东西!有没有详情讲解?

[C语言]C语言是目前世界上流行、使用非常广泛的高级程序设计语言。 C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它高级语言,许多大型应用软件都是用C语言编写的。 C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画它是数值计算的高级语言。 常用的编译软件有Microsoft Visual C++,Borland C++,Watcom C++ ,Borland C++ ,Borland C++ Builder,Borland C++ 3.1 for DOS,Watcom C++ 11.0 for DOS,GNU DJGPP C++ ,Lccwin32 C Compiler 3.1,Microsoft C,High C,TurboC等等......C语言的发展历史C语言的发展颇为有趣。 它的原型ALGOL 60语言。 (也成为A语言)1963年,剑桥大学将ALGOL 60语言发展成为CPL(Combined Programming Language)语言。 1967年,剑桥大学的Matin Richards 对CPL语言进行了简化,于是产生了BCPL语言。 1970年,美国贝尔实验室的Ken Thompson将BCPL进行了修改,并为它起了一个有趣的名字“B语言”。 意思是将CPL语言煮干,提炼出它的精华。 并且他用B语言写了第一个UNIX操作系统。 而在1973年,B语言也给人“煮”了一下,美国贝尔实验室的在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。 为了使UNIX操作系统推广,1977年Dennis 发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。 1978年Brian 和Dennis 出版了名著《The C Programming Language》,从而使C语言成为目前世界上流行最广泛的高级程序设计语言。 1988年,随着微型计算机的日益普及, 出现了许多C语言版本。 由于没有统一的标准,使得这些C语言之间出现了一些不一致的地方。 为了改变这种情况,美国国家标准研究所(ANSI)为C语言制定了一套ANSI标准, 成为现行的C语言标准 3.C语言的主要特点 。 C语言发展迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的功能。 许多著名的系统软件, 如DBASE Ⅲ PLUS、DBASE Ⅳ 都是由C 语言编写的。 用C语言加上一些汇编语言子程序, 就更能显示C语言的优势了,象PC- DOS 、WORDSTAR等就是用这种方法编写的。 C语言版本 目前最流行的C语言有以下几种:·Microsoft C 或称 MS C·Borland Turbo C 或称 Turbo C·AT&T C 这些C语言版本不仅实现了ANSI C标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。 面向对象的程序设计语言 在C的基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。 C++目前流行的最新版本是Borland C++4.5,Symantec C++6.1,和Microsoft VisualC++ 2.0。 C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。 因而也增加了整个语言的复杂性,掌握起来有一定难度。 C语言的特点1. 简洁紧凑、灵活方便C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。 它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。 2. 运算符丰富C的运算符包含的范围很广泛,共有种34个运算符。 C语言把括号、赋值、强制类型转换等都作为运算符处理。 从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。 3. 数据结构丰富C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。 能用来实现各种复杂的数据类型的运算。 并引入了指针概念,使程序效率更高。 另外C语言具有强大的图形功能, 支持多种显示器和驱动器。 且计算功能、逻辑判断功能强大。 4. C是结构式语言结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。 这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。 C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。 5. C语法限制不太严格、程序设计自由度大一般的高级语言语法检查比较严,能够检查出几乎所有的语法错误。 而C语言允许程序编写者有较大的自由度。 6. C语言允许直接访问物理地址,可以直接对硬件进行操作因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可以用来写系统软件。 7. C语言程序生成代码质量高,程序执行效率高一般只比汇编程序生成的目标代码效率低10へ20%。 8. C语言适用范围大,可移植性好C语言有一个突出的优点就是适合于多种操作系统, 如DOS、UNIX,也适用于多种机型。 C源程序的结构特点1.一个C语言源程序可以由一个或多个源文件组成。 2.每个源文件可由一个或多个函数组成。 3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。 4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。 5.每一个说明,每一个语句都必须以分号结尾。 但预处理命令,函数头和花括号“}”之后不能加分号。 6.标识符,关键字之间必须至少加一个空格以示间隔。 若已有明显的间隔符,也可不再加空格来间隔。 书写程序时应遵循的规则当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。 从应用的角度,C语言比其他高级语言较难掌握。 总之,C语言既有高级语言的特点,又具有汇编语言的特点;既是一个成功的系统设计语言,有时一个使用的程序设计语言;既能用来编写不依赖计算机硬件的应用程序,又能用来编写各种系统程序;是一种受欢迎、应用广泛的程序设计语言。 C语言有很多的优点指针就是C语言的一大特色,可以说C语言优于其它高级语言的一个重要原因就是因为它有指针操作可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素.C++在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。 Java又进一步提高了安全性。 C语言的缺点C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别[关于C++]C++,这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,它是一种使用非常广泛的计算机编程语言。 C++是一种静态数据类型检查的,支持多重编程范式的通用程序设计语言。 它支持过程序程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。 贝尔实验室的本贾尼·斯特劳斯特卢普(w:en:Bjarne Stroustrup)博士在20世纪80年代发明并实现了C++(最初这种语言被称作“C with Classes”)。 一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。 虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。 1998年国际标准组织(ISO)颁布了C++程序设计语言的国际标准ISO/IEC -1998。 遗憾的是,由于C++语言过于复杂,以及他经历了长年的演变,直到现在(2004年)只有少数几个编译器完全符合这个标准(这么说也是不完全正确的,事实上,至今为止没有任何一款编译器完全支持ISO C++)。 另外,就目前学习C++而言,可以认为他是一门独立的语言;他并不依赖C语言,我们可以完全不学C语言,而直接学习C++。 根据《C++编程思想》(Thinking in C++)一书所评述的,C++与C的效率往往相差在正负5%之间。 所以有人认为在大多数场合C++ 完全可以取代C语言(然而我们在单片机等需要谨慎利用空间、直接操作硬件的地方还是要使用C语言)。 根据Effective C++第三版第一条款的描述,现在C++由以下四个“子语言”组成:1、C子语言。 C++支持C语言的几乎全部功能,在语法上与C语言仅有极微妙的差别(如括号表达式的左右值性,具体请参考C++标准文献)。 2、面向对象的C++。 C++首先作为一门面向对象的语言而闻名,这个特点在这里不再详述。 3、泛型编程语言。 C++强大(但容易失控的)模板功能使它能在编译期完成许多工作,从而大大提高运行期效率。 4、STL(C++标准模板库)。 随着STL的不断发展,它已经逐渐成为C++程序设计中不可或缺的部分,其效率可能比一般的naive代码低些,但是其安全性与规范性使它大受欢迎。 C++语言发展大概可以分为三个阶段:第一阶段从80年代到1995年。 这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借着接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程序库的出现,泛型程序设计在C++中占据了越来越多的比重性。 当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;第三阶段从2000年至今,由于以Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程序设计语言中最复杂的一员。 C++的Hello World程序 在使用兼容C89标准(也称为ANSI C)的编译器时,下面这个程序显示“Hello, world!”然后结束运行: (事实上这并不是符合98标准[ISO C++]的C++程序,而且在多数编译器上这个程序也不能运行,若要在比较旧的编译器上编译该程序,应将iostream改为iostream.h)#include <iostream> int main() { std::cout << Hello, world!\n; } 在使用兼容C99标准(ISO/IEC -1998)的编译器时,下面的程序也是可以的: #include <iostream> using namespace std; int main() { cout << Hello, world! << endl; return 0; } 根据ISO C++的规定,main函数的形式只能是 int main() { ... } 以及 int main(int argc,char * argv[]) { ... } 尽管如此,但在大部份(其实是在Windows平台下的大部分)编译器上, void main() { ... } 也被支持。 C++程序员的数量 分析机构EvansData定期对开发人员展开调查,其调查结果与Stroustrup提出的C++正在扩张的说法相违背。 EvansData的数据显示,以C++为工具的开发人员在整个开发界所占的比例由1998年春天的76%下降至2004年秋的46%。 Forrester最新的调查显示,C++、微软VisualBasic和Java是众多公司产品体系的首选语言。 对100家公司的调查显示,C/C++、VisualBasic和Java在产品体系中的使用比例分别是59%、61%和66%。 相关网站 Bjarne Stroustrups homepage~bs/

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: C

“程序效率提升之旅-开启C-深入探究虚函数优化 (程序效率提升怎么算)” 的相关文章

深化剖析-atomic-代码范例和实践运行-std-现代-中的原子-C (深化剖析整改)

深化剖析-atomic-代码范例和实践运行-std-现代-中的原子-C (深化剖析整改)

一、引言 在并发编程中,原子操作是一种无法终止的操作,即在多线程环境中,一旦开局就不会被其余线程搅扰。C++11引入了std::atomic库以支持原子操作,为并发编程提供了更为方便和高效的...

编程实践-哈希负载均衡算法-IP-C (编程实践心得体会)

编程实践-哈希负载均衡算法-IP-C (编程实践心得体会)

Nginx 是一个高性能的开源 Web 服务器和反向代理服务器,因其高效处理高并发的请求而闻名。以下是一些 Nginx 用于处理高并发的主要特点和技术: 事件驱动架构: Nginx 使...

提升性能的新利器-17中的并行功能-C (提升 性能)

提升性能的新利器-17中的并行功能-C (提升 性能)

C++17扩展了STL(Standard Template Library,标准模板库)以支持并行算法。这意味着许多常见的算法,如std::sort、std::for_each、std::tran...

让新手也能轻松把握-C-类模板特化与承袭经常使用指南 (请问新手)

让新手也能轻松把握-C-类模板特化与承袭经常使用指南 (请问新手)

一、类模板特化 1.特化的成功 你可以为特定类型提供类模板的替代成功。例如,你或许以为constchar类型(C格调字符串)的Grid行为没无心义。Grid<constchar&...

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

了解圈套和无效经常使用技巧-言语变长参数-C (了解圈套和无线的区别)

C工具 变长参数列表 这局部解释了旧的C格调变长参数列表。了解这些内容很关键,由于你或许会在遗留代码中遇到它们。但是,在新代码中,你应该经常使用变参模板来成功类型安保的变长参数列表。...

的区别-中-C-math.h-和-cmath (的区别中的钱)

的区别-中-C-math.h-和-cmath (的区别中的钱)

一、引言 C++规范库中的<cmath>和C言语规范库中的<math.h>均为数学函数库,它们提供了一系列数学函数和常量。但是,这两者之间存在一些关键的区别...

监禁程序后劲的优化利器-C-中的内联函数 (监禁等于坐牢吗)

监禁程序后劲的优化利器-C-中的内联函数 (监禁等于坐牢吗)

一、内联函数的定义和特点 内联函数是一种不凡的函数,它经过在编译时将函数调用交流为函数体中的代码,以缩小函数调用的开支,从而提高程序的口头效率。内联函数通罕用于那些函数体较小、调用频繁的场景...

与设计形式-可裁减的代码-C-打造可保养 (设计与形式的关系)

与设计形式-可裁减的代码-C-打造可保养 (设计与形式的关系)

引言 C++是一种弱小的编程言语,它提供了许多工具和库以支持面向对象编程和通用编程。设计形式是一种用于处置特定疑问的经过验证的处置打算。C++的灵敏性和设计形式的广泛...