2012-04-10 25 views
5

¿Me pregunto si puedo usar punteros de 32 bits en aplicaciones de 64 bits?c: ¿usa punteros de 32 bits en la aplicación de 64 bits?

El proyecto de nuestra escuela solo nos permite compilar el programa c en la aplicación de 64 bits y prueba nuestro programa para la velocidad y el uso de la memoria. Sin embargo, si soy capaz de usar punteros de 32 bits, entonces mi programa se consume mucha menos memoria que en 64 bits, también tal vez corre más rápido (más rápido a malloc?)

Gracias por la ayuda

+0

¿Cómo puede estar tan seguro de que los punteros de 32 bits será notablemente más rápido que los punteros de 64 bits (si es que lo hace)? – Mysticial

+1

al menos consume menos memoria. No estoy seguro acerca de la velocidad de marcha más rápida – kevin

+0

¿Estás seguro de que incluso va a ser significativo? ¿Tiene estructuras de datos basadas en punteros masivos? También tenga en cuenta que las operaciones de extensión cero de sobrecarga o de puntero repetido pueden en realidad causar * una disminución * en el rendimiento. – Mysticial

Respuesta

0

que puede reducir la memoria uso - marginalmente - pero no mejorará la velocidad ya que tendría que traducir su puntero corto a puntero absoluto, y eso agrega sobrecarga, también se pierde la mayoría de los beneficios de la verificación de tipo.

Se vería algo como esto:

typedef unsigned short ptr; 
... 

// pre-allocate all memory you'd ever need 
char* offset = malloc(256); // make sure this size is less than max unsigned int 

// these "pointers" are 16-bit short integer, assuming sizeof(int) == 4 
ptr var1 = 0, var2 = 4, var3 = 8; 

// how to read and write to those "pointer", you can hide these with macros 
*((int*) &offset[var1]) = ((int) 1) << 16; 
printf("%i", *((int*) &offset[var1])); 

con un poco más trucos, usted puede inventar su propio brk() para ayudar a la asignación de la memoria del offset.

¿Vale la pena? IMO no.

+1

Estrictamente hablando, este código se basa en un comportamiento indefinido, aunque en la práctica probablemente no cause problemas de alineación en la mayoría de los sistemas (?). – Lundin

+0

Lo sentimos, pero ... ** Uf. ** Esto nunca será una buena idea ... pero al hacer una sugerencia masivamente desaconsejable, al menos podrías haber minimizado el potencial de UB: usa 'std :: aligned_storage 'para el tipo más estricto que se almacena, use moldes y funciones de C++, etc. –

23

¿Usando GCC?

La opción -mx32 establece los tipos int, long y pointer en 32 bits y genera código para la arquitectura x86-64. (Intel y AMD x86-64 386 Opciones):

Luego de referencia :)

+0

Eso es más o menos el camino a seguir. Tenga en cuenta que necesita una versión bastante reciente de gcc (4.7 o 4.6 con varios parches) y un binutils bastante reciente. – torek

+0

no m32, nuestro TA dijo que – kevin

+0

¿Por qué no especificar eso desde el principio? De todos modos, esta sigue siendo una respuesta mucho mejor a la pregunta real (a pesar de las restricciones pedagógicas arbitrarias) que el horrible truco que se aceptó. –

Cuestiones relacionadas