Pregunta

Esta es la función que estoy escribiendo en la máquina Linux de 64 bits.

void myfunc(unsigned char* arr) //array of 8 bytes is passed by reference
{
   unsigned long a = 0; //8 bytes
   unsigned char* LL = (unsigned char*) &a;

   LL[0] = arr[6];
   LL[1] = arr[3];
   LL[2] = arr[1];
   LL[3] = arr[7];
   LL[4] = arr[5];
   LL[5] = arr[4];
   LL[6] = arr[0];
   LL[7] = arr[2];
}

Ahora mis preguntas son:

  1. Will variable 'a' ser almacenado en un registro de manera que no lo puedo tener acceso a una y otra vez desde la memoria RAM o chache?
  2. Trabajo sobre la arquitectura de 64 bits, debo asumir que array 'arr' se almacena en un registro como parámetros de funciones se almacenan en un registro en el arco de 64 bits?
  3. ¿Qué tan eficiente es la conversión de tipos de puntero? mi suposición es que debe ser ineficiente en absoluto?

Cualquier ayuda appriciated.

Regards

¿Fue útil?

Solución

  1. a no se puede almacenar en un registro, a medida que ha tomado su dirección. (Valdo señala correctamente que un compilador muy inteligente podría Optimizar la matriz accede en operaciones de bits y a licencia en un registro, pero nunca he visto un compilador de hacer eso, y no estoy seguro de que terminaría siendo más rápido).
  2. arr (el puntero en sí) se almacena en un registro (%edi, en AMD64). La contenido de la matriz son en la memoria.
  3. Puntero conversión de tipo por sí mismo a menudo genera ningún código en absoluto. Sin embargo, haciendo cosas tontas con los moldes tipo puede conducir a un código muy ineficiente, o incluso al código cuyo comportamiento no está definido.

Parece que usted está tratando de permutar los bytes en una matriz y luego empujarlos en un número, y el código de máquina de su ejemplo se genera no es muy malo para eso. La sugerencia de David con el uso de cambios y enmascarar las operaciones de cambio es bueno (esto también va a evitar problemas si su código nunca necesita ejecutarse en una máquina-big endian), y también hay las instrucciones del vector permutar SSE, pero he oído Son una especie de dolor para su uso.

A propósito, usted debe hacer el tipo de retorno de la función ejemplo, ser unsigned long y return a; puesto al final; entonces usted puede utilizar gcc -O2 -S y ver exactamente lo que se obtiene a partir de la compilación. Sin el cambio a a retorno, GCC alegremente optimizar la distancia todo el cuerpo de la función, ya que tiene efectos secundarios no visibles externamente.

Otros consejos

Se podría hacer mejor a utilizar el cambio explícito y enmascarar las instrucciones para lograr esto, en lugar de utilizar la indexación de matrices.

Las operaciones de matriz se va a hacer más difícil para el compilador a utilizar registros para esto, ya que por lo general no son instrucciones que hacen cosas como "carga de 8 bits desde el 3er byte del registro A". (Una optimización del compilador podría darse cuenta de que es posible hacer esto con los cambios / máscaras, pero no estoy seguro de cómo es probable que).

  1. La pregunta sobre si el a variable se almacena en el registro es una cuestión de optimización. Como no hay volatile modificador mi humilde opinión un compilador inteligente hará esto.

  2. Es una cuestión de la convención de llamada. Si, por convención, un único parámetro de puntero se transfiere en un registro -. Por lo que será arr

  3. Pointer tipo de colada no es una operación que interpreta la CPU. No hay código generado por ella. Es sólo la información para el compilador acerca de lo que quiere usted decir.

(En realidad a veces fundición no produce código adicional, pero esto está relacionado con la herencia múltiple y polimorfismo)

Depende de su nivel de optimización. Puede examinar el conjunto de responder a sus preguntas. Con gcc, utilice la "-s" bandera.

gcc -S -O0 -o /tmp/xx-O0.s /tmp/xx.c
gcc -S -O3 -o /tmp/xx-O3.s /tmp/xx.c

El generada montaje es completamente diferente. (Asegúrese de que el cambio sugerido por return a; Zack .)

este mensaje en busca de pistas sobre la forma de generar un mezclado c / montaje lista (que se convierte rápidamente inútil con optimización).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top