首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

几个没注意过的有关问题

2012-02-21 
几个没注意过的问题1,virutal方法同时可以是inline?深度探索C++内存模型 中这么说,但依稀记得 effectiv

几个没注意过的问题
1,   virutal   方法同时可以是inline?
<深度探索C++内存模型> 中这么说,   但依稀记得 <effective   C++> 说一个virtual不会同时是一个inline.   我这么定义一个方法到没报错.

2,   在VS2003的vector类定义中有:
class   vector...  
{
public:
class   iterator;
friend   class   iterator;
};  
有啥妙用?   这两个iterator不同吧?   有点 "重载 "的感觉,   (当然没有 "重载类 "的概念)

3,   汇编语言写的代码为啥跑得快?
      高级语言最终要被翻译成低级语言,   是编译器优化得不够程序员的好吧?

[解决办法]
1.inline几乎没用.inline是展开代码.而virtual是动态执行.到运行的最后时刻才知道要干什么.
你这样没错.但是我认为inline没用.
2.我看过SGI的源码.没看过VC的.第一句应该是声明.使之可见.第二句.使之成为友元.
猜的.呵呵.
3.汇编一般用在和底层打交道多的场合.嵌入式之流.真正写汇编代码的时候,你就知道C太高级了.真的.
很多时候,当你拿到的资料是一堆硬件连接图的时候,是大量的内部寄存器的时候,你肯定会用汇编的.C反而不好..

我觉得没多少人能优化的比编译器好.当然了.高手不在此列.

[解决办法]
1. 只要同时满足virtual和inline的语义,virtual和inline能不能在一起就不是c++语法的问题,而是编译器实现的问题。有的编译器可能允许在一起,有的可能不允许,只要c++标准没有强制规定,那么编译器可以做他们认为好的,或者容易实现的事情

2. 是一样的,后者声明iterator为vector的友元,这样实现iterator起来会更加方便

3. 举个例子,比如我们现在要写一个打印 "hello world "的程序,c++的版本是
#include <iostream>
int main()
{
std::cout < < "hello world ";
return 0;
}
这段代码所要做的事情比你看上去的要多,除了打印hello world之外,程序在开始还要构造一些全局变量,比如说std::cout,之后当然还要析构。而如果用汇编来做这件事情,我们可以只做我们想做的事情,即通过一个系统调用在屏幕上输出 "hello world "。
一般来讲,语言越高级,所做的事情越通用,而低级的语言更加适合特定的实现,这就像为你量身定做一双鞋,虽然很费时间,但是肯定比去市场上买一双鞋更合脚
[解决办法]
对于第三个问题我想说的是:

汇编可能是最枯燥的,但又是最灵活的。由于一切高级语言最终将成为汇编指令(二进制机器指令码)在计算机上运行。所以不管是函数式语言LISP、逻辑语言Prolog,还是命令式语言ALGOL60,Fortran,PASCAL,C或是面向对象语言C++,Java,C#,Smalltalk,它们最终将成为机器指令在计算机上跑。

现在问题是目前硬件发展速度相当快,涉及领域也比较大,对于通用的传统高级语言编译器无法做到100%地利用CPU指令机能。如利用超标量流水线,指令的并行发布:如Blackfin处理器上:
r0 = r0 - r0(ns) || [p0++] = r1 || [i0--] = r2;
上面这条指令称为复合指令,Blackfin DSP处理器利用指令流水线并行发布它,使原本的三条指令在一个时钟周期内完成。
而Intel处理器的指令玩起来更爽,只是在Windows操作系统上会受到比较大的限制。有些应该在实模式下玩起来有意思。对于Intel P4 IA32构架在其官方网站有下载,资料比较齐,有兴趣的可以看看。目前Intel C/C++编译器以及Intel Fortran编译器都对自己的扩展指令集给予支持。一些复杂指令虽然看上去复杂,用起来感到复杂,但却很高效。
以上只针对运行效率,而不谈什么可移植性、可维护性等问题。
[解决办法]
1)virtual函数可以是Inline的,但它们不会同时发生作用。当这个函数没有使用动态绑定时,编译器就可以对它进行Inline。比如,你可以A::f();这么调用,来跳掉动态绑定。
2)内嵌类被声明为友元时,必须先进行前置声明/定义,否则是声明另外一个外部类为友元。
但是,内嵌类本来就可以直接访问其包容类的私有成员的,这个友元声明是多余的。
3)只有极少极少数人能写出比编译器优化更快的汇编代码,而他们大部分都在写编译器。这个问题没啥意义。

热点排行