当前位置:天才代写 > tutorial > C语言/C++ 教程 > More Effective C++之思量改观措施库

More Effective C++之思量改观措施库

2017-11-06 08:00 星期一 所属: C语言/C++ 教程 浏览:467

副标题#e#

措施库的设计就是一个折衷的进程。抱负的措施库应该是短小的、快速的、强大的、机动的、可扩展的、直观的、普遍合用的、具有精采的支持、没有利用约束、没有错误的。这也是不存在的。为尺寸和速度而举办优化的措施库一般不能被移植。具有大量成果的的措施库不会具有直观性。没有错误的措施库在利用范畴上会有限制。真实的世界里,你不能拥有每一件对象,总得有支付。

差异的设计者给这些条件赋予了差异的优先级。他们从而在设计中牺牲了差异的对象。因此一般两个提供沟通成果的措施库却有着完全差异的机能特征。

譬喻,思量iostream和stdio措施库,对付C++措施员来说两者都是可以利用的。iostream措施库与C中的stdio对比有几个利益(拜见Effective C++)。譬喻它是范例安详的(type-safe),它是可扩展的。然而在效率方面,iostream措施库老是不如stdio,因为stdio发生的执行文件与iostream发生的执行文件对比尺寸小并且执行速度快。

首先思量执行速度的问题。要想把握iostream和stdio之间的机能不同,一种要领就是用这两个措施库来运行benchmark措施。不外你必需记着benchmark也会撒谎。不只很难拿出一组可以或许代表措施或措施库典范用法的数据,并且就算拿出来也是没用,除非有靠得住的要领判定出你或你的客户的具有什么样的特征。不外在办理一个问题的不消要领的较量上,benchmark照旧可以或许提供一些信息,所以尽量完全依靠benchmark是愚蠢的,可是忽略它们也是愚蠢的。

让我们测试一个简朴的benchmark措施,只测试最根基的I/O成果。这个措施从尺度输入读取30000个浮点数,然后把它们以牢靠的名目写到尺度输出里。编译时预处理惩罚标记STDIO抉择是利用stdio照旧iostream。假如界说了这个标记,就是用stdio,不然就利用iostream措施库。


#p#副标题#e#

#ifdef STDIO
#include <stdio.h>
#else
#include <iostream>
#include <iomanip>
using namespace std;
#endif
const int VALUES = 30000; // # of values to read/write
int main()
{
 double d;
 for (int n = 1; n <= VALUES; ++n) {
  #ifdef STDIO
   scanf("%lf", &d);
   printf("%10.5f", d);
  #else
   cin >> d;
   cout << setw(10) // 设定field宽度
   << setprecision(5) // 配置小数位置
   << setiosflags(ios::showpoint) // keep trailing 0s
   << setiosflags(ios::fixed) // 利用这些配置
   << d;
  #endif
  if (n % 5 == 0) {
   #ifdef STDIO
    printf("\n");
   #else
    cout << '\n ';
   #endif
  }
 }
 return 0;
}

当把正整数的自然对数传给这个措施,它会这样输出:

0.00000 0.69315 1.09861 1.38629 1.60944
1.79176 1.94591 2.07944 2.19722 2.30259
2.39790 2.48491 2.56495 2.63906 2.70805
2.77259 2.83321 2.89037 2.94444 2.99573
3.04452 3.09104 3.13549 3.17805 3.21888

这种输出至少表白了利用iostreams也能这种也能发生fixed-format I/O。虽然,

cout << setw(10)
<< setprecision(5)
<< setiosflags(ios::showpoint)
<< setiosflags(ios::fixed)
<< d;

远不如 printf("%10.5f", d); 输入利便。

可是操纵符<<既是范例安详(type-safe)又可以扩展,而printf则不具有这两种利益。

我做了几种计较机、操纵系统和编译器的差异组合,在其上运行这个措施,在每一种环境下都是利用stdio的措施运行得较快。优势它仅仅快一些(约莫20%),有时则快许多(靠近200%),可是我从来没有碰着过一种iostream的实现和与其相对应的stdio的实现运行速度一样快。别的,利用stdio的措施的尺寸比与相应的利用iostream的措施要小(有时是小得多)。(对付措施现实中的尺寸,这点差别就微不敷道了)。

应该留意到stdio的高效性主要是由其代码实现抉择的,所以我已经测试过的系统其未来的实现可能我没有测试过的系统的当前实现都大概表示出iostream和stdio并没有显著的差别。事实上,有来由相信会发明一种iostream的代码实现比stdio要快,因为iostream在编译时确定它们操纵数的范例,而stdio的函数则是在运行时去理会名目字符串(format string)。iostream和stdio之间机能的比拟不外是一个例子,这并不重要,重要的是具有沟通成果的差异的措施库在机能上采纳差异的衡量法子,所以一旦你找到软件的瓶颈,你应该知道是否大概通过替换措施库来消除瓶颈。好比假如你的措施有I/O瓶颈,你可以思量用stdio替代iostream,假如措施在动态分派和释放内存上利用了大量时间,你可以想想是否有其他的operator new 和 operator delete的实现可用(拜见条款8和Effective C++条款10)。因为差异的措施库在效率、可扩展性、移植性、范例安详和其他一些规模上蕴含着差异的设计理念,通过调动利用给以机能更多思量的措施库,你有时可以大幅度地提高软件的效率。

 

    关键字:

天才代写-代写联系方式