繁体   English   中英

C++/C# 数组移位等效项

[英]C++/C# Array shift equivilents

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

感谢您的帮助,格雷格

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

如果您迫切希望这样做,您可以使用 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] , arrays 是零索引,因此您使用它的方式将访问 memory 超过数组末尾。

您提供的翻译效率非常低,因为它需要多次复制数组的内容。 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++ 代码相比),但总体性能应该几乎相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM