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++不同,安全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++代码相比),但总体性能应该几乎相同。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '