C ++ / C#数组移位等价物

时间:2011-07-11 21:22:39

标签: c# c++ arrays

我正在尝试将一些代码从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)

感谢您的帮助, 格雷格

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

如果你迫切希望这样做,你可以使用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],数组是零索引,所以你使用它的方式会在你的数组末尾访问内存。

答案 2 :(得分:0)

您提供的翻译效率非常低,因为它需要多次复制数组内容。 C ++中的表达式df[ x ]等同于*(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 ++代码相比),但整体性能应该几乎相同。