我有以下情況。託管代碼將初始化很多類的對象,這是一個非託管結構的包裝。我可以爲此做兩種方法。一個是擁有一個託管類包裝器,它只有一個指向非託管對象的指針。另一個是擁有一個完整的託管類,並在需要調用非託管方法時創建非託管對象。我提供了以下兩種方法。有人告訴我,如果我使用方法1(有一個指向無人管理對象的指針),GC將會有很多問題知道非託管部分,最好採取方法2。有人告訴我哪個更好,或者如果有是另一種更好的方法。我對方法2的關注是,每次調用非託管方法時都會複製。我不確定GC問題是否勝過它。高效地調用非託管方法將非託管對象作爲託管代碼的參數
編輯 - 第一種方法有一個ref類,第二種方法有一個值類。究其原因,第二個是值,使得其可以更有效地
添加到列表在非託管:
struct A_UNMANAGED
{
int a;
int b[20];
};
void GetData(A_UNMANAGED& a); // populates A
在管理(第一種方法)
public ref class A_MANAGED
{
A_UNMANGED* ap;
public:
property System::UInt32 a
{
System::UInt32 get() { return ap->a; }
void set(System::UInt32 value) { ap->a = value; }
}
property array<System::UInt32>^ b
{
array<System::UInt32>^ get() { return ap->b; }
void set(array<System::UInt32>^ value) { b = value; } // assume this copy works
}
internal:
void GetData()
{
GetData(ap);
}
};
在託管(第二種方法)(編輯:更新爲參考假設所有垃圾收集和指針創建寫入正確)
public value class A_MANAGED
{
System::UInt32 a;
array<System::UInt32>^ b;
public:
property System::UInt32 a
{
System::UInt32 get() { return a; }
void set(System::UInt32 value) { a = value; }
}
property array<System::UInt32>^ b
{
array<System::UInt32>^ get() { return b; }
void set(array<System::UInt32>^ value) { b = value; }
}
internal:
void GetUnmanaged(A_UNMANAGED& obj1)
{
obj1.a = a;
pin_ptr<System::UInt32> bp = &b[0];
memcpy(obj1.b, bp, 20);
}
void GetData()
{
A_UNMANAGED obj2;
GetUnmanaged(obj2);
GetData(obj2);
// copy from obj2 to member variables
}
};
我打算標記第一級參考。我確實有析構函數和終結器,但沒有寫在這裏。也正如我所指定的假設b副本的作品。我的問題是要知道哪種方法更好,如果GC和價值問題是真的 – 2011-04-14 01:07:31
那麼,你通過發佈蹩腳的代碼浪費了我的時間。這麼做的意義何在?它不會改變我的答案。 – 2011-04-14 01:10:28