2012-04-10 14 views
5

Zastanawiam się, czy mogę używać wskaźników 32-bitowych w aplikacjach 64-bitowych?c: używać wskaźników 32-bitowych w aplikacji 64-bitowej?

Nasz projekt szkolny pozwala nam tylko skompilować program c do aplikacji 64-bitowej i testuje nasz program pod kątem szybkości i użycia pamięci. Jednakże, jeśli jestem w stanie użyć wskaźników 32-bitowe, a następnie mój program zużywa znacznie mniej pamięci niż w wersji 64-bitowej, również może to działa szybciej (szybciej malloc?)

Dzięki za pomoc

+0

Jak możesz być tak pewny, że 32-bitowe wskaźniki będzie zauważalnie szybszy niż wskaźniki 64-bitowe (jeśli w ogóle)? – Mysticial

+1

przynajmniej zużywa mniej pamięci. Nie jestem pewien co do szybszej prędkości jazdy. – kevin

+0

Czy jesteś pewien, że to będzie nawet znaczące? Czy masz masywne struktury danych oparte na wskaźnikach? Należy również pamiętać, że operacje zerowego przedłużania wskaźnika lub powtarzania wskaźnika mogą spowodować * obniżenie * wydajności. – Mysticial

Odpowiedz

0

może zmniejszyć pamięć Użycie - marginalnie - ale nie poprawi szybkości, ponieważ trzeba by przetłumaczyć krótki wskaźnik na bezwzględny wskaźnik, a to zwiększa obciążenie, a także traci większość korzyści wynikających z typowania.

To mogłoby wyglądać tak:

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

z nieco więcej sztuczek, można wymyślać własne brk(), aby pomóc alokacji pamięci z offsetem.

Czy to się opłaca? IMO nr.

+1

Ściśle mówiąc, kod ten opiera się na niezdefiniowanym zachowaniu, chociaż w praktyce prawdopodobnie nie spowoduje problemów z wyrównaniem w większości systemów (?). – Lundin

+0

Przepraszam, ale ... ** Ugh. ** To nigdy, nigdy nie będzie dobrym pomysłem ... ale gdy robisz bardzo niewskazaną sugestię, możesz na leleast_ zminimalizować potencjał dla UB: użyj 'std :: aligned_storage 'dla najbardziej rygorystycznego typu jest przechowywany, użyj odpowiednich rzutów i funkcji C++, itd. –

23

Korzystanie z GCC?

Opcja -mx32 ustawia typy int, long i wskaźnik na 32 bity i generuje kod dla architektury x86-64. (Intel 386 i AMD x86-64 opcje):

Następnie wyznacznikiem :)

+0

To jest dość droga. Zauważ, że potrzebujesz dość aktualnej wersji gcc (4.7 lub 4.6 z różnymi łatkami) i całkiem niedawno binutils. – torek

+0

no m32, nasza TA powiedziała, że ​​ – kevin

+0

Dlaczego nie określić tego na samym początku? W każdym razie jest to o wiele lepsza odpowiedź na pytanie (realistyczne) pomimo arbitralnych ograniczeń pedagogicznych niż straszliwy hack, który został przyjęty. –

Powiązane problemy