从 Java的“Final“ 到C++的”Const“(1)

C++的const 原来不应该是一个复杂的概念,但是C++ primer却花了很多篇幅去解释,看了之后还是有很多不理解。看来还是要从java的final入手

 

在谈final之前我们现看一个最简单的程序:

 

Class Main{

 public String a=Test.aa;

 public String b=Test.bb;

     public static void main(String args[]){

      ....

     }

}

Class Test{

 public final static String aa="HelloA";

 public final static String bb=new String("HelloB");

}

 

ok, 写到这里大家肯定要问了,Main中的a 和 b 到底有什么区别?

我们先什么都不说,看一下反编译的结果。

zheng@zheng-laptop:~/workspace/Test/src$ javap  -c Main
Compiled from "Main.java"
public class Main extends java.lang.Object{
public java.lang.String MainA;
public java.lang.String MainB;
public Main();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."<init>":()V
   4:    aload_0
   5:    ldc    #2; //String HelloA
   7:    putfield    #3; //Field MainA:Ljava/lang/String;
   10:    aload_0
   11:    getstatic    #4; //Field Test.bb:Ljava/lang/String;
   14:    putfield    #5; //Field MainB:Ljava/lang/String;
   17:    return
public static void main(java.lang.String[]);
  Code:
   0:    return
}

想必你已经看出来了吧,在第5行java进行了一次值赋值,所以就直接霸HelloA给Main.a了。  而在第11行,java则是传给b一个Object,也就是将Test.bb给了Main.b;

这是为什么了,C++中说 const其中一个功能就是为了加快编译速度,的确值赋值加快了编译的速度(java应该也是这么做的)

但是这可能会引发一个问题,如果修改aa的值,并且就编译Test.java,Main中的a还是原来的”HelloA“,没有改变,因为final在这种情况下是直接赋值的。

这个是java编译器的优化,具体的,大家可以继续参考http://www.blogjava.net/aoxj/archive/2009/11/10/165536.html

 

另外java的final还有inline的功能,这个和C++有异曲同工之妙。简单的来说就是内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。

但 是网上有人说这样并没有加快速度,这是为什么呢?明天去测试一下,今天有点晚了,就写到这里,

看来就连最基本的东西还有好多不懂阿

明天将继续分析C++的const,并和java做一下区别。

nite all.

 



 

posted @ 2009-12-03 00:41  郑惠沄  阅读(1212)  评论(0)    收藏  举报