从 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 到底有什么区别?
我们先什么都不说,看一下反编译的结果。
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.

浙公网安备 33010602011771号