因此,对于我的研究小组,我试图将一些旧的C ++代码转换为Java,并且遇到了一个问题,在C ++代码中它执行以下操作:
method(array+i, other parameters)
现在我知道Java不支持指针算法,所以我通过将数组+ i中的子数组复制到数组末尾到新数组来解决这个问题,但这会导致代码运行速度非常慢(即速度慢100倍)比C ++版本)。有办法解决这个问题吗?我看到有人在这里提到了内置方法,但是更快吗?
答案 0 :(得分:6)
您的代码不仅变慢,而且还会改变正在发生的语义:当您使用C ++进行调用时,不会进行任何数组复制,因此method
可能对数组应用的任何更改都是发生在原件中,而不是丢弃的副本。
要在Java中实现相同的效果,请更改函数的签名,如下所示:
void method(array, offset, other parameters)
现在调用者必须传递method
应该考虑"虚拟零"的数组中的位置。数组。换句话说,而不是写
for (int i = 0 ; i != N ; i++)
...
你必须写
for (int i = offset ; i != offset+N ; i++)
...
这将保留将数组传递给成员函数的C ++语义。
答案 1 :(得分:2)
C ++函数可能依赖于array
开头的处理。在Java中,它应该被配置为从偏移量运行到数组中,因此不需要复制数组。即使使用System.arraycopy
,复制数组也会花费大量时间。
可以将它定义为类似这样的Java方法:
void method(<somearraytype> array, int offset, other parameters)
然后该方法将从数组的偏移处开始,并且它将被调用如下:
method(array, i, other parameters);
答案 2 :(得分:0)
如果您希望将子数组传递给方法,则将子数组复制到新数组的替代方法是使用额外的offset
参数传递整个数组,该参数指示第一个相关索引数组。这需要更改method
的实施,但如果性能是一个问题,那可能是最有效的方式。
答案 3 :(得分:0)
处理此问题的正确方法是重构方法,进行签名
method(int[] array, int i, other parameters)
以便传递整个数组(通过引用),然后告诉方法从哪里开始处理。那你就不需要复制了。