Java-java 中基本数据类型的生成方式是什么
我在更改一个C代码到java的时候发现一个小问题,我没有看过jvm的原理,所以不太清楚。希望获得大家指教。
C的代码一般会这样写:
int c
int i
for(i=0;i<10;i++){
c = i+3;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我在更改一个C代码到java的时候发现一个小问题,我没有看过jvm的原理,所以不太清楚。希望获得大家指教。
C的代码一般会这样写:
int c
int i
for(i=0;i<10;i++){
c = i+3;
}
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
我的一点理解:
C89的行为可以理解为进入方法的时候完成栈内存分配 但是这个分配是手工完成的。“变量声明必须先于函数体内所有执行语句”
C99、C++则没有这个限制 可以在任何地方定义变量。变量跟随定义入栈,在离开作用域后出栈。会存在变量的栈压入弹出操作。
所以类似for(){ int c = 3; }这种语句 会在每一次循环是申请一个栈变量C,然后在循环结束后释放。循环100次就申请/释放了100次。不过,听说会有编译器对这种操作进行优化,把int C的操作提到循环外面。这个有待确认
虽然按照你的样例代码来说,c没有意义。但是不会不同。所有堆栈分配都在进入方法的时候就结束,无论是c(c99)、c++、java还是csharp。
两者的代码是一样的,无论是在哪里定义的。
===================================
java和csharp的行为都可以直接看IL确认。csharp确认过了。c99和c++也很好确认,直接看asm然后看里头的做法即可,刚刚确认过没有栈指针的下移操作,请看最后。
========================================
这是java的做法:
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=3, args_size=1
0: iconst_0
1: istore_1
2: iload_1
3: bipush 100
5: if_icmpge 25
8: iload_1
9: iload_1
10: iadd
11: istore_2//注意这里,直接保存到栈上,没有重新分配
12: getstatic #2 // Field java/lang/System.out:Ljav
a/io/PrintStream;
15: iload_2
16: invokevirtual #3 // Method java/io/PrintStream.prin
tln:(I)V
19: iinc 1, 1
22: goto 2
25: return
LineNumberTable:
line 5: 0
line 7: 8
line 8: 12
line 5: 19
line 10: 25
StackMapTable: number_of_entries = 2
frame_type = 252 /* append */
offset_delta = 2
locals = [ int ]
frame_type = 250 /* chop */
offset_delta = 22
}
=======================================
如下代码用vs2012编译,没有开优化,没有开c99标准支持(for的初始化字段不能加声明)
int main()
{
00EF13A0 push ebp
00EF13A1 mov ebp,esp
00EF13A3 sub esp,0D8h
00EF13A9 push ebx
00EF13AA push esi
00EF13AB push edi
00EF13AC lea edi,[ebp-0D8h]
00EF13B2 mov ecx,36h
00EF13B7 mov eax,0CCCCCCCCh
00EF13BC rep stos dword ptr es:[edi]
int c;
for(c = 0; c < 10; ++c)
00EF13BE mov dword ptr [c],0
00EF13C5 jmp main+30h (0EF13D0h)
00EF13C7 mov eax,dword ptr [c]
00EF13CA add eax,1
00EF13CD mov dword ptr [c],eax
00EF13D0 cmp dword ptr [c],0Ah
00EF13D4 jge main+41h (0EF13E1h)
{
int a = 1+c;//注意这一段,直接保存到了ebp-14h去了。
00EF13D6 mov eax,dword ptr [c]
00EF13D9 add eax,1
00EF13DC mov dword ptr [ebp-14h],eax
}
00EF13DF jmp main+27h (0EF13C7h)
}
00EF13E1 xor eax,eax
00EF13E3 pop edi
00EF13E4 pop esi
00EF13E5 pop ebx
00EF13E6 mov esp,ebp
00EF13E8 pop ebp
00EF13E9 ret