五千年(敝帚自珍)

主题:【原创】猛批烂书 程序员面试宝典 上 -- 晨池

共:💬64 🌺96 新:
分页树展主题 · 全看首页 上页
/ 5
下页 末页
    • 家园 悲剧的阶乘

      int find(int n);

      {

      if (n=1) t=1;

      else

      {

      return find (n-1) * n;

      }

      }

      强制给n赋值啊

      这东西岂不是永远返回1~~~

    • 家园 花你的认真哈

      看得我手痒,也来说几句

      但是inline在和宏相比没有付出任何额外代价的情况下更安全

      这个得看编译器。对Borland的编译器,在优化全开的情况下,inline函数的调用,其形参和局部变量必须在栈上实际分配,而无论函数多么短小。这样,对短小的函数,inline不inline其实效率差不多。但宏就不一样了。

      还有那个把fact(8)优化成push 40h,涉及到两个编译优化,其一是inline展开,其二是常数的扩展(即在编译状态下可确定为常数的变量被替换成相应常数)。单纯地说,inline展开是确实有的,只是两个编译优化共同作用下看不到了。

      C. It can not be used explicitly in memeber function of class X. (不能在类的成员函数里明确的声明)

      这里的中文翻译有点小问题。“used”应该是使用的意思,而不是声明。我的翻译是“不能在类成员函数显式使用this指针”。这显然是错误的,所以是该题的答案。

      vector<CDemo> *a1 = new vector<CDemo>();

      a1->push_back(d1);

      delete a1;

      这个,在我上课的时候被用于最经典的C++指针误用例子。为什么呢?我把正确的用法写出来大家应当就知道了:

      vector<CDemo> a1;

      a1.push_back(d1);

      不过,几乎所有现在的C++语法书介绍指针的时候,竟然都是类似的例子......

      另外上面的代码可能存在一个严重的问题,因为我从来不用STL所以不确定。“vector<CDemo>” 应当以CDemo对象为元素,那么push_back的时候,d1将被复制一份。而CDemo的复制函数,在第一个版本中,是编译器缺省生成的......第二个版本加了复制构造函数应当没有问题。当然,如果vector<CDemo>内部用指针来管理元素,那也可能没有这个问题,但会引发另外的问题......反正问题很严重。这也是我从来不用STL的原因:吖的封了一层又一层,谁知道你里面是怎么实现的?我用复杂的数据结构说明我的算法复杂,要对实现细节进行把握才能获得预期的高效,现在我啥都不知道了,谁敢保证我的算法不踩地雷?

      还有这个:

      CDemo d1;

      d1.str = new char[32];

      个人认为这个CDemo类实在是一个糟糕得不能再糟糕的例子......

      通宝推:铁手,
      • 家园 The C++ standard library

        中文版《C++ 标准程序库》(侯捷/孟岩译),这本书可以说对是STL规范描述,多翻翻就有感觉了。

        比如vector,书中明确说明只支持值语义,而非引用语义。(因此auto_ptr不能在vector类容器中使用:因为它有owner的概念,不支持值语义)。

      • 家园 嗯,关于inline那个,我确实不知道宝兰是如此处理的

        优化全开的时候这样处理,您应该对编译器和编译原理很了解吧,我对这方面知道的很少,仅限于C/C++语言编译时候有些特显,我处于兴趣看看汇编给编译成审查样子。

        inline,我感觉不用也可以,因为编译器处理的时候,如果有些函数它认为值得,即使我们没有用inline这个关键字,也会扩展开的。。。

        至于那个翻译么,嘿嘿,本来就是从烂书里抄出来的,他们那本书里面的翻译很成问题

        其实我觉得STL挺好的,在实现上是有一定约束的,而且必然是开源的(目前还没有编译器支持模板不开源发布),所以里面的东西用起来,在满足约束的前提下,还是比较安全的。不过STL封了一层层以后,如果语法有个小错误,那个报错报的啊,真是要人命

        • 家园 __forceinline

          VC的关键字,应该可以取代inline。(GCC 下为__inline__ __attribute__((always_inline)))。这样应该更符合程序员的口味。(虽然和inline一样不能100%确定把inline展开,比如debug模式,递归函数等。)

        • 家园 我只是对体系结构比较感兴趣

          因为我们做图像视频,很多时候需要用矢量指令,按照cache大小和结构进行优化,所以对体系结构、编译优化都比较感兴趣。有时候需要优化程序,要选择下手的地方,所以得分析编译器的输出,看看瓶颈在哪里。

          inline的问题,是各个编译器支持的很不相同。而且如前面有人说的,它仅仅是一个hint。要不要其实不重要。所以现在我写程序基本上不考虑这个。现实而言,Borland的支持很弱,基本上有没有无差别。而且,Borland的编译器要求inline函数必须在头文件中定义,这就导致很多问题。VC支持还可以,且有优化选项,让编译器自动选择小函数做inline。所以差别也不大。其它的用得不多,不是很清楚。

          STL的最大问题是它搞得太复杂了,用起来类似于高射炮打蚊子。而且一个非常严重的缺点是,把所有数据结构都搞了一套大致差不多的接口。我用不同的数据结构目的就是用不同的功能,你搞成相同的,我怎么知道你是啥意思啊?所以这玩意对初学者就是满眼的地雷阵。我收上来的作业中,这些错误实在太多太多了。对高手,这玩意又是一个鸡肋,功能虽然强大,但在每次使用的时候,都免不了要写过于复杂的适配代码,而且还没把握写得对不对,更不知道其内部实现算法是否符合预期。还有,不同STL的内部实现差别很大,虽然接口相同,却往往导致不兼容。所有这些问题绞在一起,我非常不建议使用这些东西。再说,实现这些结构都非常容易,每个人都应当有自己的一套库,这样用起来显然是最顺手的,和乐而不为?

      • 家园 没记错的话,STL vector使用array实现的~~

        STL cmath的pow用了就踩雷,2的3次方2返回 7.999999999999999~~

        • 家园 估计是转成浮点了

          不过,CMATH是C++的(实际上是C的),不是STL的.

        • 家园 能展开点不?

          STL的vector要求必须用连续的内存空间实现吧,array倒是可以,那个pow用了就踩雷,是什么意思啊?

          • 家园 某些情况下Cmath的pow会返回奇怪的double

            比如说2^3有些时候会返回7.9999999999,boss当年ACM world final就在这踩响了地雷

            • 家园 cmath里面的pow()是浮点的

              涉及到浮点的问题就不是一般的费解啊。pow的内部可能是用牛顿迭代之类的方法写的,有误差难免。

              7.9999999999其实和8是相等的--在特定浮点容许度范围内,所以也不能说pow()的结果有问题。

              记得在实现取整的函数时,floor(a + 0.5 + EPS),因为没有最后的EPS而得到错误结果。这块的地雷真不少啊。

分页树展主题 · 全看首页 上页
/ 5
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河