Hãy xem xét một cấu trúc như System.Drawing.Point - một với LayoutKind.Sequential và chỉ chứa các thành viên nguyên thủy. Tôi có một mảng C# của các cấu trúc như vậy.Mảng hỗn hợp của các cấu trúc từ .NET đến C++: khi nào nó sao chép?
Tôi chuyển nó sang hàm C++ (không được quản lý) qua P/Invoke. Ở phía C++ có định nghĩa tương ứng về cấu trúc (ví dụ: struct Point { int x, y; };
). Hàm này mất Point*
arg.
Câu hỏi của tôi là, trong trường hợp nào CLR sao chép dữ liệu và trong trường hợp nào nó chỉ cần ghim nó? Biến bao gồm:
- loại mảng: một chiều hoặc hình chữ nhật
- C định nghĩa # của hàm - sử dụng
Point*
hoặcPoint[]
/Point[,]
- sử dụng
fixed(Point* pointer = array)
hay không
Tôi muốn tránh sao chép vì nó chậm.
Nó không phải là tài liệu, mảng đơn giản chỉ được ghim. Sử dụng trình gỡ rối trong trường hợp nghi ngờ, gõ '* & array' để lấy địa chỉ mảng trong C#. Và so sánh với giá trị con trỏ bạn nhận được trong mã gốc. +8 ở chế độ 32 bit. –