等于增加一个C/C++;Java中的指针?

等于增加一个C/C++;Java中的指针?,java,c++,arrays,pointers,programming-languages,Java,C++,Arrays,Pointers,Programming Languages,我确实有一种感觉,人们会试图打我的头,说“你不应该那样做!”(我很清楚这个事实);然而,我的问题是: 假设你有以下C++代码: 编辑: 我想我还没有充分展示我正在努力做的事情,尽管大多数答案都很好。这是我的代码的编辑版本。它的核心是每次迭代我仍然需要使用一个值数组,它恰好是x的子数组,而不仅仅是索引处的单个值: unsigned int n = 2000; // or any other number for that matter double * x = new double[n]; dou

我确实有一种感觉,人们会试图打我的头,说“你不应该那样做!”(我很清楚这个事实);然而,我的问题是:

假设你有以下C++代码:

编辑: 我想我还没有充分展示我正在努力做的事情,尽管大多数答案都很好。这是我的代码的编辑版本。它的核心是每次迭代我仍然需要使用一个值数组,它恰好是
x
的子数组,而不仅仅是索引处的单个值:

unsigned int n = 2000; // or any other number for that matter
double * x = new double[n];
double resultArray;

// fill array with meaningful data
// do all kinds of initializations

for( int i=0 ; i<someNumber ; ++i ){ //someNumber ~ 1900

    // do some stuff

    for (j=0 ; j<someSmallerNumber ; ++j){ //someSmallerNumber ~ 15
        resultArray[j] = x[j] * someFunction(resultArray[j]);
    }

    ++x; //increment pointer to the first element of the array

    // do some more stuff

}
无符号整数n=2000;//或者其他任何数字
double*x=新的double[n];
双结果射线;
//用有意义的数据填充数组
//进行各种初始化

对于(inti=0;i简短回答:没有直接等价物


使用索引或使用
for(double d:array of _double)
-for
结构更容易让VM优化。

为每个
循环使用
for(double d:theArray)
-这是惯用的方法,它为VM提供了最清晰的优化机会


如果中断条件取决于数组中的当前位置,则最好使用带有手写计数器的经典
for
循环-抱歉。

有效的方法是使用索引,并在循环中递增它

JIT有权在循环外提升边界检查,前提是它能够证明索引变量只是以有序的方式覆盖范围。在您的情况下,JIT可能很难证明
someSmallerNumber
总是足够小,但它仍然可以提升到内循环外。一旦它每个外部循环检查一次
someSmallerNumber

对于最简单的情况,使用所谓的“For each”,即使编译器发出在内部使用索引的字节码(我不知道它是否使用),JIT也应该立即看到索引不能超出范围

如果我使用x[outerIndex+innerIndex] 而不是仅仅x[innerIndex],我会 每秒钟执行更多的添加 迭代


无法保证JIT比您更笨-如果它愿意,它可以在寄存器中保存重复使用的部分计算的值。恐怕我不知道在实践中,JIT是否会发现
x[outerIndex+innerIndex]可以通过重新使用数组中间的地址来计算不同的值。重新使用的值不是GC指针,增加了复杂性,也没有必要,但是它可能或可能不能在C++中进行完全相同的优化。但是一个好的C++优化器可能在没有您的帮助下进行优化,所以我不会是一个。如果JIT也可以,我并不感到惊讶。

我经常看到的习惯用法是从数组中读取值并将其存储在局部变量中,操作该局部变量,最后将结果存储回:

for (int i = 0; i < someNumber; ++i)
{
    double val = x[i];

    // do heavy lifting with val

    x[i] = val;
}

不是C++。C++中的速度快不一定适用于java。这是其中的一个例子。

正如一些人所建议的,在Java中使用for(int val:x)将不会给您任何优势,而不是:

for(int i = 0; i < x.length; i++)
{
    int val = x[i];
}
for(int i=0;i
此处参考

人们在这里所说的关于虚拟机的话是可以在运行时自由地进行优化的,这是正确的


所以,是的,你确实需要被打得头昏眼花:-)。java和C++看起来很相似,但是在java中,你所做的不是在其他情况下你会做的:要编写好的java,你必须用Java来思考;对于C++,你必须用C++来思考。

你最好是替换<代码>双*x=新的double [n];<代码>带有
标准::向量x(n)因为这使您无需
删除[]x手动。我也相信C++版本过早优化。任何优秀的优化器都会看到,索引计算的一部分可以从内部循环中移出。
for(int i = 0; i < x.length; i++)
{
    int val = x[i];
}