考虑一个像System.Drawing.Point这样的结构体 - 其中有LayoutKind.Sequential,并且仅包含原始成员。我有一个C#结构体数组。
我通过P/Invoke将其传递给(非托管的)C++函数。在C++侧,有相应的结构定义(例如
struct Point { int x,y; };)。该函数需要一个Point*
参数。
我的问题是,在什么情况下CLR会复制数据,在什么情况下只需固定它?变量包括:
- 数组类型:一维或矩形
- C#函数定义 - 使用Point*
还是Point[]
/Point[,]
- 使用fixed(Point* pointer = array)
还是不使用
我想避免复制,因为它很慢。
*&array
以获取数组地址。并与您在本机代码中获得的指针值进行比较。在32位模式下为+8。 - Hans Passant