【问题标题】:C++/C# Array shift equivilentsC++/C# 数组移位等效项
【发布时间】:2011-07-11 21:22:39
【问题描述】:

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

感谢您的帮助, 格雷格

【问题讨论】:

  • 有一些当前的index 而不是df2[1]df[index+1] 有什么问题?
  • 你还没有在 C# 代码 sn-p 中声明 df2。此外,您似乎正在从df2 复制到它自己。此外,没有复制第一个示例。这些怎么可能是一样的?
  • 另外,C++ sn-p 包含内存泄漏。
  • 对。 C++ 代码不是复制数组,只是使用指针来索引数组。 df2 = df[coefIND]; coefIND += 4;。而df2[1] 变成了df[coefIND+1]
  • 我建议使用集合类,例如 List,而不是数组。

标签: c# c++ arrays


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这将非常低效,因为将构建大量额外的数组并复制数据。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-08-23
      • 2011-02-07
      • 2010-11-25
      • 2012-12-29
      • 1970-01-01
      • 2012-07-31
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多