2012-04-10 6 views
5

Ich frage mich, ob ich 32-Bit-Zeiger in 64-Bit-Anwendungen verwenden kann?c: 32-Bit-Zeiger in 64-Bit-Anwendung verwenden?

Das Projekt unserer Schule ermöglicht es uns nur, das c-Programm in 64-Bit-Anwendung zu kompilieren und sie testen unser Programm auf Geschwindigkeit und Speichernutzung. Allerdings, wenn ich bin in der Lage 32bit Zeiger zu verwenden, dann wird mein Programm verbrauchen viel weniger Speicher als in 64bit, auch vielleicht läuft es schneller (schneller malloc?)

Danke für die Hilfe

+0

Wie Sie so sicher sein, dass 32-Bit-Zeiger wird spürbar schneller als 64-Bit-Zeiger (wenn überhaupt)? – Mysticial

+1

zumindest verbraucht es weniger Speicher. Ich bin mir nicht sicher über schnellere Laufgeschwindigkeit Sache – kevin

+0

Sind Sie sicher, dass es sogar signifikant sein wird? Haben Sie massive Zeiger-basierte Datenstrukturen? Beachten Sie auch, dass die Overhead- oder wiederholten Zeiger-Nullerweiterungsoperationen tatsächlich zu einer * Abnahme * der Leistung führen können. – Mysticial

Antwort

0

kann es Speicher reduzieren Nutzung - marginal - aber es wird nicht die Geschwindigkeit verbessern, da Sie Ihren kurzen Zeiger auf absolute Zeiger zu übersetzen, und das fügt Overhead, auch verlieren Sie die meisten Vorteile der Typenkontrolle.

Es würde wie folgt aussehen:

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

mit ein bisschen mehr Tricks, können Sie Ihre eigenen brk() erfinden den Speicher aus dem Offset zu helfen zuordnet.

Ist es das wert? IMO-Nr.

+1

Genau genommen basiert dieser Code auf undefiniertem Verhalten, obwohl er in der Praxis wahrscheinlich keine Ausrichtungsprobleme auf den meisten Systemen (?) Verursacht. – Lundin

+0

Tut mir leid, aber ... ** Ugh. ** Das wird niemals eine gute Idee sein ... aber wenn man einen massiv nicht empfohlenen Vorschlag macht, könnte man _least_ das Potential für UB minimieren: benutze 'std :: aligned_storage 'Für den strengsten Typ, der gespeichert wird, verwenden Sie geeignete C++ - Umwandlungen und Funktionen usw. –

23

Verwendung von GCC?

Die Option -mx32 legt die Int-, Long- und Zeigertypen auf 32 Bit fest und generiert Code für die x86-64-Architektur. (Intel 386 und AMD x86-64-Optionen):

Dann Benchmark :)

+0

Das ist so ziemlich der richtige Weg. Beachten Sie, dass Sie eine relativ neue Version von gcc (4.7 oder 4.6 mit verschiedenen Patches) und ziemlich neue binutils benötigen. – torek

+0

nein m32, unsere TA sagte, dass – kevin

+0

Warum nicht zu Beginn angeben? Wie auch immer, das ist immer noch eine viel bessere Antwort auf die eigentliche Frage (willkürliche pädagogische Einschränkungen ungeachtet) als der schreckliche Hack, der akzeptiert wurde. –