Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为了获得性能,是否值得避免多态性?_C++_Polymorphism - Fatal编程技术网

C++ 为了获得性能,是否值得避免多态性?

C++ 为了获得性能,是否值得避免多态性?,c++,polymorphism,C++,Polymorphism,为了获得性能,是否值得避免多态性 我在Stroustrup的书中读到多态函数调用在25%以内 比普通函数调用更昂贵。这是否意味着我应该 尽可能避免多态性?我是说我应该一直思考吗 比如:好的,多态性可以解决这个问题,但它可能会一团糟 提高性能布拉布拉。。。或者考虑到现代CPU的强大功能,我甚至不应该 敢这么想吗?这是适用的经验法则 多态性的任何一个实例都不可能使您的程序慢到值得担心的程度,因此当多态性是适合当前情况的合适工具时,您应该毫不犹豫地使用它。然而,如果你把所有的东西都变成多态的,因为它以

为了获得性能,是否值得避免多态性

我在Stroustrup的书中读到多态函数调用在25%以内 比普通函数调用更昂贵。这是否意味着我应该 尽可能避免多态性?我是说我应该一直思考吗 比如:好的,多态性可以解决这个问题,但它可能会一团糟 提高性能布拉布拉。。。或者考虑到现代CPU的强大功能,我甚至不应该 敢这么想吗?

这是适用的经验法则

多态性的任何一个实例都不可能使您的程序慢到值得担心的程度,因此当多态性是适合当前情况的合适工具时,您应该毫不犹豫地使用它。然而,如果你把所有的东西都变成多态的,因为它以后可能会有用,那么你的程序就会慢到让人担心的程度,因为现在25%(或者不管它实际上是什么)的惩罚适用于每个函数调用,并且不再是你的朋友

此外,从一个拥有太多多态性的程序中删除多态性要比向一个没有足够多态性的程序中添加多态性困难得多。添加多态性是一种局部变化。删除它需要进行全局搜索,以确保获得所有实现

我在Stroustrup的书中读到多态函数调用比普通函数调用贵25%以内。这是否意味着我应该尽可能避免多态性

不,绝对不是!非虚拟调用速度非常快,因为调用本身通常是一条指令。虚拟调用需要额外的间接寻址级别;这就是所谓的25%的来源,但这是“纯粹的开销”,也就是说,当你比较两个无参数函数的调用时,你所测量的开销。一旦您开始添加参数,特别是需要复制的参数,这两个开销之间的差距就会缩小:例如,将字符串按值传递给虚拟函数和非虚拟函数会使这一差距很难测量

此外,更昂贵的只是调用指令本身,而不是函数本身。调用函数的开销只占函数总计时的一小部分。函数越长,调用开销所占的百分比就越小


总的来说,您应该努力提高代码的可理解性。如果添加带有虚拟函数的子类可以更容易地理解您的设计,那么您应该尽一切努力使用子类。代码运行的硬件每年都会变得更快,因此从长远来看,可读性是有利的。

它比普通函数调用更昂贵,但它有自己的优势。多态性是所有OO语言最强大的功能之一。使用多态性,您可以相当容易地实现多种设计模式,并节省大量时间。而且它保持代码干净、优雅、可重用、易于扩展和维护。这是最大的优势。所以这真的是一种折衷

与许多关于性能/效率的问题一样,您通常需要根据具体情况进行评估。它可以在运行时性能和一般编程问题(如多功能性和可维护性)之间进行权衡

尽管如此,基于假设的性能考虑避免使用这样一个主要的语言特性可能是个坏主意。任何单个函数调用(即使是间接调用)的影响都非常小。与其他典型的瓶颈相比,您必须非常频繁地调用它才能产生显著的影响

如果存在与特定函数调用相关的重大性能问题,那么(根据我的经验),对算法的其他调整往往更有用。例如,预取或缓存数据,或者寻找其他方法来减少调用频率

我在Stroustrup的书中读到多态函数调用比普通函数调用贵25%以内

这可能是事实(可能是一个大概的数字),但并不是那么重要。即使虚拟函数调用的成本比普通函数调用高25%,这仍然只是函数调用的成本,而不是函数执行的成本。我只是想精确一点。函数调用的成本通常比函数执行的成本小得多。但是请注意,它也并非总是无关紧要的,如果滥用多态性并将其用于所有函数,即使是最微不足道的函数,那么额外的开销可能会很快累积起来

但最重要的是,虚拟函数调用必须通过函数指针进行调度,函数指针意味着没有内联或任何形式的跨上下文优化。这通常是大多数减速的原因,也就是说,您不应该将“虚拟函数调用”与“函数调用”相比较,而应该将“虚拟函数调用”与“静态分析、潜在内联、lto优化的函数调用”相比较

为了获得性能,是否值得避免多态性

在C++中,一般来说,只要有价格,就有收益,只要有收益,就有价格。就这么简单。动态多态性的代价是:(1)函数调用的开销,(2)阻止静态分析和优化,(3)通常需要堆分配的对象和额外的间接寻址(指针、引用等),等等,仅举几例。但是,您还可以在以下方面获得巨大的收益:(1)运行时灵活性,(2)可伸缩性(问题域的不相交联合),(3)减少编译时间,(4)减少代码重复,等等

关键是,如果你想要多态性买给你的东西,那么你应该使用它。但是如果你不需要这些东西(而且你会惊讶地发现你经常不需要这些东西)