2013-11-22 53 views
1

我正在開發其由兩個部分組成的應用程序:傳遞大的數據結構以非託管代碼使用固定指針

  1. C#前端
  2. C++算術達

在某些情況下從C#傳遞到C++的數據量可能非常大。我正在談論Gb,也許更多。特別是有大量的雙精度數組,我想將一個固定/固定指針傳遞給C++代碼。嘎吱嘎吱的數字可能需要幾個小時才能完成。我擔心可能由於使用固定指針而觸發任何問題。正如我所看到的,垃圾收集器將無法長時間觸摸這個大內存區域。這會導致任何問題嗎?我應該考慮一個不同的策略嗎?

我認爲,而不是傳遞整個數組,我可以提供一個接口,用於在C++代碼中構建此數組,以便內存由應用程序的非託管部分擁有。但最終,這兩種策略都會創建大量內存,而這些內存很長一段時間對於C#垃圾收集器來說不可重新定位。我錯過了什麼嗎?

回答

1

您沒有問題。大型數組分配在大型對象堆中。釘住它們不會有任何有害的影響,蕙沒有壓縮。這裏的「大」表示32位代碼或任何等於或大於85,000字節的數組具有1000個或更多元素的雙精度數組。

+1

在LOH中多次分配高達GB或更多沒有不利影響? – Alex

+0

從.net 4.5.1開始,可以「按需」對LOH進行壓縮(http://blogs.msdn.com/b/mariohewardt/archive/2013/06/26/no-more-memory-fragmentation-on- the-large-object-heap.aspx) –

+0

@ Christian.K所以它不是自動的,而是每個方法的調用。看來我很好嗎? – Max

0

對於您的特定用例,可能需要使用內存映射文件作爲c#和C++代碼之間的共享內存緩衝區。這完全避開了垃圾收集器。而且還可以讓OS高速緩存尋呼機處理內存壓力問題,而不是GC管理的內存。

相關問題