c++ / c#数组移位设备

本文关键字:数组 c++ | 更新日期: 2023-09-27 18:02:00

我正在尝试将一些代码从c++转换为c#,我不确定这两个语句是否等效。

c++(源代码):

float* df = new float[ length ]  // length is a previously initialized int
int coefIND = 0;
do
{
    float* const df2 = df + coefIND;
    // some element reassignments such as df2[1] = x[...] * y[...];
    coefIND += 4;
}
while(coefINF < length);
delete[] df;  // this occurs much later though
c#(翻译):

float[] df = new float[ length ]
int coefIND = 0;
do
{
     Array.Copy(df, 0, df, coefIND, length);
     // some element reassignments such as df[1] = x[...] * y[...];
     coefIND += 4;
}
while(coefIND < length)

谢谢你的帮助,格雷格

c++ / c#数组移位设备

您还没有展示df2的c#定义,但是最好的解决方案可能是将coefIND添加到代码体中的每个索引中,而不是复制到临时数组中(然后再复制回来)。与c++不同,安全c#不允许在数组中存储指向元素的指针。

如果你非常想这样做,你可以使用linq.

df2 = df.Skip(coefIND).ToArray();

然而,我相信在c++中,你假设浮点数的大小是4字节(因此增加4)。

一个更好的循环实现应该是;

for (var coefIND=0;coefIND<df.length;coefIND++) {
  // some element reassignments such as df[coefIND] = x[...] * y[...];
}

你的代码在注释中提到了df[1],数组是零索引,所以你使用它的方式将访问数组结束后的内存

您提供的转换效率非常低,因为它需要多次复制数组的内容。表达式df[ x ]在c++中相当于*(df + x),您可以将这种转换应用于代码中以获得:

float[] df = new float[ length ]
int coefIND = 0;
do
{
     // some element reassignments such as:
     df[ coefIND + 1] = x[... ] * y[...];
     coefIND += 4;
}
while(coefIND < length);

请注意,随着循环中的所有操作都展开,您可能会有一些额外的添加(与c++代码相比),但总体性能应该几乎相同。