2014-05-21 84 views
5

我有兩個類是否有可能類字段複製不安全

[StructLayout(LayoutKind.Explicit, Size = 12, CharSet = CharSet.Ansi)] 
unsafe class Dto 
{ 
    [FieldOffset(0)] 
    public int B; 
    [FieldOffset(4)] 
    public int C; 
    [FieldOffset(8)] 
    public int D; 
} 
[StructLayout(LayoutKind.Explicit, Size = 12, CharSet = CharSet.Ansi)] 
unsafe class Model 
{ 
    [FieldOffset(0)] 
    public int B; 
    [FieldOffset(4)] 
    public int C; 
    [FieldOffset(8)] 
    public int D; 
} 

有從DTO的實例複製從字段的數據O模型的實例的方式嗎? 對於單場我有下面的代碼

var a1 = new Dto { B = 10, C = 20, D = 30 }; 
var a2 = new Model(); 

unsafe 
{ 
    fixed (int* pa1 = &(a1.B)) 
    { 
      fixed (int* pa2 = &(a2.B)) 
      { 
       *pa2 = *pa1; 
      } 
    } 
} 

不C#提供了類似的方法來複制整個對象?由於高性能環境,逐場複製是不可取的。

+0

你的意思是,像[C的memcpy(http://www.cplusplus.com/reference/cstring/memcpy/)? – StuartLC

+4

這些應該是普通的結構。不要做任何不安全的事情,你可以簡單地分配。值類型的存在使代碼更快,使用它們。 –

+1

「由於高性能環境,不適合複製逐場複製。」 ==>你測過它了嗎?任何實際的性能問題? – ken2k

回答

2

您最關心的是性能。如果您逐字段複製,這將轉化爲6 mov指令。這很難讓它更快。

使用指針不會減少所需的指令數量。爲什麼呢?你仍然需要相同的作業。

調用memcpy涉及的指令遠遠多於開銷。

因此,您應該使用安全的託管代碼編寫「天真」的三個任務,以獲得最佳性能。事實上,複製這個12字節的對象非常便宜,我懷疑你的性能問題是否有效。我懷疑這會顯示在任何配置文件。

對於複印性能,使用class還是struct並不重要。但由於其他差異,struct具有一定的性能優勢。你可能想要調查它們。

0

在C#中最接近memcpy的是Buffer.BlockCopy,雖然它是爲數組設計的。

這是關於該主題的interesting article

我認爲,如果你想簡化你的代碼,刪除不安全的,只需使用普通結構也許與轉換操作符,你會很驚訝的表現。

有點像;

public struct Model 
    { 
     public int B; 
     public int C; 
     public int D; 

     public Model(Dto dto) 
     { 
     B = dto.B; 
     C = dto.C; 
     D = dto.D; 
     } 

     static public implicit operator Model(Dto dto) 
     { 
     return new Model(dto); 
     } 
    } 

將允許你剛纔說......

 Dto a1 = new Dto { B = 10, C = 20, D = 30 }; 

    Model m = a1; 
+0

我沒有完全描述我的問題。抱歉。將數據從現有實例複製到現有實例也是目標的一部分。 –

+0

我不確定我明白你的意思。你能改述你的評論嗎? – tooslow

+0

主要目標是實現對象的重用。我有一個DTO池和一個模型對象池。在收到DTO時,我必須將其複製到Model對象,並將其釋放到池中。 –

相關問題