2014-05-21 7 views
5

Ho due classiE 'possibile copiare i campi di classe con pericoloso

[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; 
} 

Esiste il modo per copiare dati di campi da istanza di DTO o istanza di modello? Per un singolo campo ho seguente codice

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; 
      } 
    } 
} 

non C# forniscono metodo simile per copiare tutto l'oggetto? La copia campo per campo non è desiderabile a causa dell'ambiente ad alte prestazioni.

+0

Vuoi dire, come un [c memcpy] (http://www.cplusplus.com/reference/cstring/memcpy/)? – StuartLC

+4

Queste dovrebbero essere semplici strutture. Non ha senso fare qualcosa di non sicuro, puoi semplicemente assegnare. Esistono tipi di valore per rendere il codice più veloce, usarli. –

+1

"La copia campo per campo non è auspicabile a causa dell'ambiente ad alte prestazioni." ==> L'hai misurato? Qualche problema di prestazioni? – ken2k

risposta

2

La vostra preoccupazione principale è la prestazione. Se si copia campo per campo, ciò si tradurrà in 6 mov istruzioni. È molto difficile renderlo più veloce di così.

L'utilizzo dei puntatori non riduce il numero di istruzioni richieste. Perché dovrebbe? Hai ancora bisogno degli stessi incarichi.

Chiamare il numero memcpy implica molto più in alto delle semplici istruzioni 6 mov.

Quindi è necessario scrivere i "ingenui" tre incarichi utilizzando il codice gestito in sicurezza per ottenere prestazioni ottimali. In effetti, copiare questo oggetto a 12 byte è così economico che dubito che i vostri problemi di prestazioni siano validi. Dubito che questo verrà visualizzato su qualsiasi profilo.

Per prestazioni di copia non importa se si utilizza class o struct. Ma lo struct ha alcuni vantaggi in termini di prestazioni a causa di altre differenze. Potresti voler indagare su di loro.

0

La cosa più simile alla memcpy in C# è Buffer.BlockCopy, sebbene sia progettato per gli array.

Questo è un interesting article sull'argomento.

Penso che se si dovesse semplificare il codice, rimuovere il non sicuro e utilizzare solo le semplici strutture, magari con gli operatori di conversione, si sarebbe molto sorpresi dalle prestazioni.

Qualcosa come;

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); 
     } 
    } 

ti permettono di dire basta ...

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

    Model m = a1; 
+0

Non ho completamente descritto la mia domanda. scusa. Copia i dati da un'istanza esistente a un instans esistente anche la parte dell'obiettivo. –

+0

Non sono sicuro di capire cosa intendi. Potresti riformulare il tuo commento? – tooslow

+0

L'obiettivo principale è ottenere il riutilizzo degli oggetti. Ho un pool di DTO e un pool di oggetti del modello. Quando ricevo un DTO, devo copiarlo su Model object e rilasciarlo al pool. –

Problemi correlati