primo sguardo a questo esempio:
Il codice C per un semplice programma C è riportata qui sotto
struct Foo {
char a;
int b;
double c;
} foo1,foo2;
void foo_assign(void)
{
foo1 = foo2;
}
int main(/*char *argv[],int argc*/)
{
foo_assign();
return 0;
}
l'equivalente codice ASM per foo_assign() è
00401050 <_foo_assign>:
401050: 55 push %ebp
401051: 89 e5 mov %esp,%ebp
401053: a1 20 20 40 00 mov 0x402020,%eax
401058: a3 30 20 40 00 mov %eax,0x402030
40105d: a1 24 20 40 00 mov 0x402024,%eax
401062: a3 34 20 40 00 mov %eax,0x402034
401067: a1 28 20 40 00 mov 0x402028,%eax
40106c: a3 38 20 40 00 mov %eax,0x402038
401071: a1 2c 20 40 00 mov 0x40202c,%eax
401076: a3 3c 20 40 00 mov %eax,0x40203c
40107b: 5d pop %ebp
40107c: c3 ret
Come potete vedere, un compito viene semplicemente sostituito da un'istruzione "mov" in assem bly, l'operatore di assegnazione significa semplicemente spostare i dati da una posizione di memoria ad un'altra posizione di memoria. L'assegnazione lo farà solo per i membri immediati di una struttura e non riuscirà a copiare quando si dispone di tipi di dati complessi in una struttura. Qui COMPLEX significa che non puoi avere una serie di puntatori, che puntano agli elenchi.
Un array di caratteri all'interno di una struttura non funzionerà sulla maggior parte dei compilatori, questo perché l'assegnazione semplicemente cercherà di copiare senza nemmeno considerare il tipo di dati di tipo complesso.
fonte
2013-01-30 05:59:56
Ricorda che non c'è una copia profonda, indica che la memoria non viene copiata. –
Anche qui la concorrenza è un problema. –
@Tim La concorrenza non è più un problema di quanto lo sia per l'assegnazione dei tipi incorporati, come numeri interi e doppi - l'assegnazione non è un'operazione atomica per questi. –