我目前有一个方法可以执行以下操作:给定:value,offset,stride,它将值添加到值,使其保持在一组大小步幅内。
实例:
20,5,30 => 25个
29,5,30 => 4
42,5,30 => 47个
我目前的代码是:
int cycle(int value, int offset, int stride) {
final int rem = value % stride;
return ((rem + offset) % stride - rem + value);
}
编译如下:
int cycle(int, int, int);
Code:
0: iload_1
1: iload_3
2: irem
3: istore 4
5: iload 4
7: iload_2
8: iadd
9: iload_3
10: irem
11: iload 4
13: isub
14: iload_1
15: iadd
16: ireturn
是否有任何代码更改和/或编译器选项的组合可以使它产生类似的东西? (这个例子是手写的):
int cycle(int, int, int);
Code:
0: iload_1
1: iload_3
2: irem
3: dup
4: iload_2
5: iadd
6: iload_3
7: irem
8: isub
9: iload_1
10: iadd
11: ireturn
答案 0 :(得分:1)
大多数优化JVM,最常见的是通常使用HotSpot JVM,在应用任何其他优化之前,会将代码转换为SSA form。对于这种表示,原始代码是否在操作数堆栈上使用临时局部变量或dup
完全无关紧要,中间表示将是相同的。
所以javac
没有提供任何控制这种结构的字节代码表示的选项,但无论如何都没关系。