primer vistazo a este ejemplo:
Se da el código C para un programa simple en C por debajo de
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;
}
el equivalente Código ASM para foo_assign() es
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
Como puede ver, una tarea simplemente se reemplaza por una instrucción "mov" en un conjunto bly, el operador de asignación simplemente significa mover datos de una ubicación de memoria a otra ubicación de memoria. La asignación solo lo hará para miembros inmediatos de una estructura y no podrá copiar cuando tenga tipos de datos complejos en una estructura. Aquí COMPLEX significa que no puedes tener una matriz de punteros, apuntando a listas.
Una matriz de caracteres dentro de una estructura no funcionará en la mayoría de los compiladores, esto se debe a que la tarea simplemente intentará copiar sin siquiera considerar que el tipo de datos es de tipo complejo.
Tenga en cuenta que no hay una copia profunda, señalando que la memoria no se copia. –
La simultaneidad también es un problema aquí. –
@Tim La simultaneidad no es más un problema que para la asignación de los tipos incorporados, como los enteros y los dobles; la asignación tampoco es una operación atómica para estos. –