//本文套的是c#的壳,里面还是c++,功能是遍历大内存和计算,看看时间
//本程序调试通过,拷贝过去,修改命名空间,项目里面允许不安全代码。
//你电脑的剩余内存要足够,要不然,还是会报错
//可参考本人的上一篇文章
using System;
using System.Runtime.InteropServices;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
DateTime DT1 = DateTime.Now;
aaa.Method();
DateTime DT2 = DateTime.Now;
Console.WriteLine(DT2-DT1);
Console.ReadLine();
}
}
public static class aaa
{
static public void Method()
{
unsafe
{
const int m = 200000000;
// 使用AllocHGlobal模拟malloc
IntPtr
a = (IntPtr)
Marshal.AllocHGlobal
(m * sizeof(int));
int* a1 = (int*) a;//
精髓在此行,要不然释放内存行会报错
IntPtr b = (IntPtr)Marshal.AllocHGlobal(m * sizeof(int)); // 使用AllocHGlobal模拟malloc
int* b1 = (int*)a;
for (int i = 0; i < m; i++)
{
*a1 = i;
a1++;
}
a1--;
Console.WriteLine(*a1);
a1 = (int*)a;
for (int i = 0; i < m; i++)
{
*b1 = (*a1)*3;
a1++;
b1++;
}
b1--;
Console.WriteLine(*b1);
Marshal.FreeHGlobal(a);//释放内存
Marshal.FreeHGlobal(b);//释放内存
}
}
static public void Method2()//c#
{
const int m = 100000000;
int[] a = new int[m];
int[] b = new int[m];
for (int i = 0; i < m; i++)
{
a[i] = i;
}
Console.WriteLine(a[m - 1]);
for (int i = 0; i < m; i++)
{
b[i] = a[i] * 3;
}
Console.WriteLine(b[m - 1]);
}
}
}
//本文套的是c#的壳,里面还是c++,功能是遍历大内存和计算,看看时间//本程序调试通过,拷贝过去,修改命名空间,项目里面允许不安全代码。//你电脑的剩余内存要足够,要不然,还是会报错
byte* buff;
buff = (byte *)
Mar
sha
l.AllocHGlobal(100);/*
申请
100字节
内存
*/
Mar
sha
l.FreeHGlobal((IntPtr)buff);/*释放
申请
的
内存
*/
Note:需...
要在
C#
中调用
C++
并传递数组,可以使用平台调用(Platform Invocation Services,P/Invoke)来实现。在
C#
中,可以使用DllImport特性来声明
C++
函数,并使用IntPtr来表示指针类型。以下是一个示例代码:
```c
sha
rp
// 声明
C++
函数
\[DllImport("YourCppLibrary.dll", CallingConvention = CallingConvention.Cdecl)\]
private static extern void YourCppFunction(IntPtr array, int length);
// 定义结构体
\[StructLayout(LayoutKind.Sequential)\]
public struct YourStruct
// 定义结构体成员
public int intValue;
public float floatValue;
// ...
// 在
C#
中调用
C++
函数
YourStruct\[\] array = new YourStruct\[10\];
IntPtr ptr =
Mar
sha
l.AllocHGlobal(
Mar
sha
l.SizeOf(typeof(YourStruct)) * array.Length);
for (int i = 0; i < array.Length; i++)
Mar
sha
l.StructureToPtr(array\[i\], (IntPtr)((long)ptr + i *
Mar
sha
l.SizeOf(typeof(YourStruct))), false);
YourCppFunction(ptr, array.Length);
Mar
sha
l.FreeHGlobal(ptr);
在这个示例中,我们首先使用DllImport特性声明了一个
C++
函数,然后定义了一个结构体来表示数组的元素类型。在调用
C++
函数之前,我们使用
Mar
sha
l.AllocHGlobal方法为数组分配
内存
,并使用
Mar
sha
l.StructureToPtr方法将数组中的元素复制到
内存
中。最后,我们调用
C++
函数,并在使用完毕后使用
Mar
sha
l.FreeHGlobal方法释放
内存
。
请注意,示例中的函数和结构体名称是示意性的,你需要根据你的实际情况进行相应的修改。另外,还需要确保
C++
函数的参数类型和顺序与
C#
中的声明一致。
#### 引用[.reference_title]
- *1* [
C#
调用
C++
DLL数组,结构体传递](https://blog.csdn.net/zsqysq/article/details/119646597)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [
C#
调用
C++
dll 指针数组](https://blog.csdn.net/hondef/article/details/129027991)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]