在声明数组时将 C++ 代码转换为 C#

本文关键字:代码 转换 C++ 声明 数组 | 更新日期: 2023-09-27 18:27:13

最近我想将一些代码从OpenCV转换为C#。但是我在 c++ 中声明动态数组时遇到了一些问题。

int* memorySteps = 0;
CV_CALL( memorySteps = new int [ 10*sizeof(memorySteps[0]) ]);    

我想将其转换为普通的 c# int 数组。问题是长度。在 c++ 中,上面的声明似乎编译器将创建一个包含 40 个 int 元素的数组(因为 memorySteps[0] 类型的大小为 4,4 字节长度。我的理解正确吗?但是,这没有意义,因为实际上在算法中我只需要一个包含 10 个 int 元素的数组。所以任何人都可以给我一个提示,这是在下面(在 c# 中(,或者任何人都可以给我看其他例子:

int[] memorySteps =new int [10*sizeof(int)];

int[] memorySteps =new int [10];

在声明数组时将 C++ 代码转换为 C#

你的理解是正确的;C++版本将创建一个 40 个整数的数组,假设 sizeof(int)==4 。可能是作者与C的malloc混淆了,C的大小以字节为单位。

因此,您的第一个版本将提供相同的行为,第二个版本更有可能提供预期的行为 - 但存在超大缓冲区隐藏其他错误的危险,如果您减小大小,这些错误可能会突然暴露。

如果算法需要十个项目,则使用

int[] memorySteps =new int [10];

我怀疑C++代码本身是从 C 代码移植而来的,程序员在其中调用 malloc ,如下所示:

memorySteps = malloc(10*sizeof(memorySteps[0]));

将该代码转换为C++的人可能忘记了拿走乘数。这导致了功能正确但内存效率低下的代码(尽管现在浪费 30 个字节甚至几乎不算是低效(。

你需要的是:

int[] steps = new int [10];