2012-04-10 25 views
5

64bit uygulamalarda 32bit işaretçi kullanıp kullanamayacağımı merak ediyorum.c: 64bit uygulamasında 32bit işaretçi kullan?

Okulumuzun projesi sadece c programını 64 bitlik bir uygulamada derlememize izin veriyor ve programımızı hız ve bellek kullanımı için test ediyor. Ben 32 bit işaretçileri kullanmak mümkün Ancak, o zaman benim programı da belki daha hızlı çalışır, 64 bit çok daha az bellek tüketir (daha hızlı malloc?)

Teşekkür yardım için

o hafızayı azaltabilir
+0

32 bit işaretçileri olduğunu 64-bit işaretçilerden (hiç değilse) fark edilebilir bir şekilde daha hızlı mı olacak? – Mysticial

+1

en azından daha az bellek tüketir. Daha hızlı çalışma hızı konusunda emin değilim. – kevin

+0

Önemli olduğunu düşündüğünüzden emin misiniz? Büyük işaretçi tabanlı veri yapılarınız var mı? Ayrıca, ek yük veya tekrarlanan işaretçi sıfır uzantısı işlemlerinin aslında performansta * azalmaya * neden olabileceğini unutmayın. – Mysticial

cevap

0

kullanım - marjinal - ama kısa işaretçinizi mutlak işaretçiye çevirmeniz gerektiği için hızı artırmaz ve ek yük ekler, ayrıca yazım hatalarının çoğunu kaybedersiniz.

Böyle görünecektir:

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

biraz daha hileler, sen ofset gelen bellek ayrılırken yardımcı olmak için kendi brk() icat edebilirsiniz.

Buna değer mi? IMO no.

+1

Kesin bir ifadeyle, bu kod tanımlanmamış davranışlara dayanmaktadır, ancak pratikte çoğu sistemde uyum sorunlarına neden olmayacaktır (?). – Lundin

+0

Üzgünüz, ama ... ** Ugh. ** Bu asla, asla iyi bir fikir olmayacak ... ama büyük ölçüde tavsiye edilmeyen bir öneri yaparken, _least_ UB potansiyelini en aza indirebilirdiniz: use std :: aligned_storage 'saklanan en sıkı tip için, uygun C++ kalıpları ve işlevlerini kullanın. –

23

GCC'yi Kullanma?

-mx32 seçeneği int, long ve pointer türlerini 32 bite ayarlar ve x86-64 mimarisi için kod üretir. (Intel 386 ve AMD Seçenekler x86-64):

Sonra kriter :) bu kadar emin nasıl

+0

Gitmek için oldukça fazla yol var. Gcc'nin (4.7 ya da 4.6 ya da çeşitli yamalarla) oldukça yeni bir sürümüne ve oldukça yeni bir ikili dosyaya ihtiyacınız olduğunu unutmayın. – torek

+0

no m32, bizim TA dedi – kevin

+0

Neden en başında belirtin? Her neyse, bu hala kabul edilen korkunç hackten daha fazla bir _real_ sorusuna (keyfi pedagojik kısıtlamalara) çok daha iyi bir cevaptır. –

İlgili konular