Entra

View Full Version : Come si fa a programmare a 64 bit ?


Alex_87_xelA
05-12-2008, 18:31
ciao a tutti ... è da un po di tempo che ho una domanda (potrà essere anche stupida ma sempre una domanda è :D ) da fare.

In c++ quando programmo e voglio creare un programma ... posso scegliere solo
Win32 Console Application
Win32 Application

come faccio se voglio programmare a 64 bit ?

e che differenza c'è tra 32 e 64 ?

GRAZIE e ciao

fero86
05-12-2008, 19:06
lo sviluppo a 64 bit non é supportato dall'edizione Express di Visual C++, quindi devi anzitutto avere una delle edizioni a pagamento (oppure fare tutto a mano col Windows SDK).

poi mi pare di ricordare che devi comunque creare un progetto relativo a Win32, peró tra le architetture target all'interno del Configuration Manager devi aggiungere l'architettura a 64 bit che vuoi, x64 o Itanium (o anche tutte e due).

Alex_87_xelA
05-12-2008, 20:16
lo sviluppo a 64 bit non é supportato dall'edizione Express di Visual C++, quindi devi anzitutto avere una delle edizioni a pagamento (oppure fare tutto a mano col Windows SDK).

poi mi pare di ricordare che devi comunque creare un progetto relativo a Win32, peró tra le architetture target all'interno del Configuration Manager devi aggiungere l'architettura a 64 bit che vuoi, x64 o Itanium (o anche tutte e due).

dove si trova questo Configuration Manager ?

cdimauro
05-12-2008, 21:06
e che differenza c'è tra 32 e 64 ?
Diverse, ma con un linguaggio di più alto livello (rispetto a linguaggio macchina e assembly) come il C è molto difficile coglierle.

Alex_87_xelA
05-12-2008, 21:09
Diverse, ma con un linguaggio di più alto livello (rispetto a linguaggio macchina e assembly) come il C è molto difficile coglierle.

beh hai ragione ... cambierà la dimensione dei registri no ?
sia dati che indirizzi !!!

cdimauro
06-12-2008, 07:43
Quello è il minimo. Con x86-64 Sono anche raddoppiati sia i registri generali che quelli SSE.

E qualche altra cosuccia di cui, appunto, non te ne accorgeresti se non lavorando in linguaggio macchina o assembly.

Alex_87_xelA
06-12-2008, 13:10
Quello è il minimo. Con x86-64 Sono anche raddoppiati sia i registri generali che quelli SSE.

E qualche altra cosuccia di cui, appunto, non te ne accorgeresti se non lavorando in linguaggio macchina o assembly.

e che benefici si possono avere con 64 bits in piu rispetto ai 32 ? (parlando di alto livello)

i tipi avranno dimensione maggiore : come gli int, i double ... etc ?
solo questo ?

fero86
06-12-2008, 14:19
dove si trova questo Configuration Manager ? ultima voce del menu Build. non credevo ci volesse tanto a trovarlo...



e che benefici si possono avere con 64 bits in piu rispetto ai 32 ? (parlando di alto livello) codice macchina piu veloce, programma piu performante: tieni presente che con uno stesso numero di colpi di clock puoi spostare esattamente il doppio dei bit. ma questo é il minimo, il raddoppiamento del bus di dati e indirizzi non é l'unico miglioramento introdotto dalle due architetture a 64 bit.


i tipi avranno dimensione maggiore : come gli int, i double ... etc ?
solo questo ? non so per i double, ma gli int sono rimasti uguali. in generale evita di ragionare coi tipi del C, usa sempre i tipi Win32, per i quali la dimensione é ben definita. con l'introduzione di Win64 la dimensioni dei tipi preesistenti é rimasta uguale, in piu sono stati introdotti dei tipi che sono esplicitamente a 64 bit (suffisso "64" nel nome) e dei tipi portabili tra Win32 e Win64 (suffisso "_PTR" nel nome).

esempio: UINT e UINT32 sono a 32 bit, UINT64 é a 64 bit, UINT_PTR é a 32 bit se compili per Win32 e a 64 se compili per Win64.

qua trovi la panoramica completa: http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx
e in generale qui la panoramica sullo sviluppo a 64 bit in Visual C++: http://msdn.microsoft.com/en-us/library/h2k70f3s.aspx

se invece programmi per Linux, che Dio t'aiuti :asd:

Alex_87_xelA
07-12-2008, 02:23
ultima voce del menu Build. non credevo ci volesse tanto a trovarlo...

TROVATO !!! :D

codice macchina piu veloce, programma piu performante: tieni presente che con uno stesso numero di colpi di clock puoi spostare esattamente il doppio dei bit. ma questo é il minimo, il raddoppiamento del bus di dati e indirizzi non é l'unico miglioramento introdotto dalle due architetture a 64 bit.

Quindi in generale un'applicazione a 64 bits è Migliore ?
Quindi windows 64 bits è migliore di quello 32 ?


non so per i double, ma gli int sono rimasti uguali. in generale evita di ragionare coi tipi del C, usa sempre i tipi Win32, per i quali la dimensione é ben definita. con l'introduzione di Win64 la dimensioni dei tipi preesistenti é rimasta uguale, in piu sono stati introdotti dei tipi che sono esplicitamente a 64 bit (suffisso "64" nel nome) e dei tipi portabili tra Win32 e Win64 (suffisso "_PTR" nel nome).

esempio: UINT e UINT32 sono a 32 bit, UINT64 é a 64 bit, UINT_PTR é a 32 bit se compili per Win32 e a 64 se compili per Win64.

Hai ragione ... sono i tipi riferiti al sistema che cambiao di dimensione

qua trovi la panoramica completa: http://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx
e in generale qui la panoramica sullo sviluppo a 64 bit in Visual C++: http://msdn.microsoft.com/en-us/library/h2k70f3s.aspx

se invece programmi per Linux, che Dio t'aiuti :asd:

:D

Alex_87_xelA
07-12-2008, 02:28
lo sviluppo a 64 bit non é supportato dall'edizione Express di Visual C++, quindi devi anzitutto avere una delle edizioni a pagamento (oppure fare tutto a mano col Windows SDK).

c'è in Visual Studio 6.0 ? oppure solo nel 08 ?

poi mi pare di ricordare che devi comunque creare un progetto relativo a Win32, peró tra le architetture target all'interno del Configuration Manager devi aggiungere l'architettura a 64 bit che vuoi, x64 o Itanium (o anche tutte e due).

cosa cambia tra x64 e Itanium ? e poi se le utilizzo tutte e due assieme cosa COMBINO ? cioè quando poi vado a compilarlo e linkarlo viene generato codice per entrambi le architetture ?


:confused:

cdimauro
07-12-2008, 08:17
x64 e Itanium sono due architetture a 64 bit completamente diverse. Praticamente l'unica cosa in comune sono... i 64 bit. :D

Rispondendo a un dubbio di cui sopra, i double rimangono esattamente gli stessi. Semplicemente i long long o gli __int64 (a seconda del compilatore) anziché essere processati come coppie di valori a 32 bit, vengono elaborati come singolo valore a 32 bit.

Inoltre i puntatori passano da 32 a 64 bit.

Sulle tue considerazioni su cosa è meglio, diciamo che mediamente il codice x64 è più veloce di quello a 32 bit del 10-15% (ma occupa anche un po' di spazio in più per il codice e i puntatori).

fero86
07-12-2008, 11:59
@Alex_87_xelA: le architetture a 64 bit non mi risulta che siano supportate da Visual Studio 6.0 perché 10 anni fa non esistevano ancora.
quota meglio quando rispondi per favore :)

Alex_87_xelA
07-12-2008, 17:17
@Alex_87_xelA: le architetture a 64 bit non mi risulta che siano supportate da Visual Studio 6.0 perché 10 anni fa non esistevano ancora.
quota meglio quando rispondi per favore :)

scusa per la QUOTATURA :D farò di meglio !!!
anzi così va bene ? :D (scherzo ovviamente)

Alex_87_xelA
07-12-2008, 17:18
cosa cambia tra x64 e Itanium ? e poi se le utilizzo tutte e due assieme cosa COMBINO ? cioè quando poi vado a compilarlo e linkarlo viene generato codice per entrambi le architetture ? e come faccio ad utilizzare ad esempio Win32 ed x64 contemporaneamente ? ho cercato di fare qualcosa ma NADA !!!


alla prima gia hai risposto (e ti ringrazzio)(l'ho aggiunta per far capire poi il discorso).
ti ringrazzio pr le eventuali risposte

cdimauro
07-12-2008, 20:49
Non puoi mischiare le due cose: gli eseguibili sono generati sempre per una ben precisa architettura.

Con .NET, invece, le cose sono cambiate: viene generato UN solo "eseguibile" che viene poi convertito nel codice binario dell'architettura su cui sta girando.

Alex_87_xelA
07-12-2008, 21:16
Non puoi mischiare le due cose: gli eseguibili sono generati sempre per una ben precisa architettura.

Con .NET, invece, le cose sono cambiate: viene generato UN solo "eseguibile" che viene poi convertito nel codice binario dell'architettura su cui sta girando.

quindi ... visto che posso fare una cosa alla volta dovro fare una cosa del tipo
(è solo un esempio)

#ifdef WIN32
...
...
#else if defined WIN64
...
...
#endif

ed una volta includerò WIN32 e la seconda WIN64 ed avrò i 2 eseguibili ?

Alex_87_xelA
07-12-2008, 21:18
poi scusate una domanda banale ...
in Visual Studio 6 c'èra in project la voce setting ... dove si poteva settare le direttive del preprocessore da includere ... l'ottimizzazione ... il warning level ... ma tutto questo in visual studio 08 dove stà ?

cdimauro
07-12-2008, 21:31
Francamente non ricordo.

Per risponderti alla domanda di prima: no, non servono le direttive condizionali. Se vuoi generare un eseguibile a 32 bit o a 64 bit, devi selezionare un apposito parametro del compilatore.

Alex_87_xelA
07-12-2008, 21:39
Francamente non ricordo.

Per risponderti alla domanda di prima: no, non servono le direttive condizionali. Se vuoi generare un eseguibile a 32 bit o a 64 bit, devi selezionare un apposito parametro del compilatore.

avevo utilizzato le direttive condizionali perchè ad esempio nelle applicazione win ... quindi non console è possibile scegliere tra INT32 e INT64 ... perquesto facevo una cosa del genere

#ifdef WIN32
#define INT INT32
#else if defined WIN64
#define INT INT64
#endif

in modo che se usavo un'architettura a 32 bits utilizzavo int a 32 altrimenti 64.
-------------------------
poi ti ricordi per caso quale paramentro ?
ti riferisci al configuration manager ?

cdimauro
07-12-2008, 22:51
Sì.

Sulle direttive OK: molti sorgenti fanno delle scelte in base all'architettura target.

fero86
08-12-2008, 12:11
Con .NET, invece, le cose sono cambiate: viene generato UN solo "eseguibile" che viene poi convertito nel codice binario dell'architettura su cui sta girando. é vero che l'IL é sempre uguale (o almeno credo), ma non é vero che l'eseguibile é lo stesso per qualsiasi architettura: un eseguibile .NET é comunque un normalissimo eseguibile in formato PE/COFF e quindi puó essere a 32 bit o a 64 bit.

fero86
08-12-2008, 12:19
avevo utilizzato le direttive condizionali perchè ad esempio nelle applicazione win ... quindi non console è possibile scegliere tra INT32 e INT64 ... perquesto facevo una cosa del genere

#ifdef WIN32
#define INT INT32
#else if defined WIN64
#define INT INT64
#endif

in modo che se usavo un'architettura a 32 bits utilizzavo int a 32 altrimenti 64. questo non devi farlo tu; é sufficiente che tu usi il tipo INT_PTR.

edit - a parte che neanche funzionerebbe perché quando é definita WIN64 é automaticamente definita anche WIN32, quindi casomai dovresti invertire l'#ifdef.



poi ti ricordi per caso quale paramentro ?
ti riferisci al configuration manager ? il Configuration Manager si occupa di configurare (sennó che Configuration Manager é :D) tutto l'ambiente per compilare a 64 bit: macro, switch di compilazione, impostazioni dell'IDE, e via dicendo.

se invece usi direttamente il Windows SDK da qualche parte (penso anche nel gruppo del menu Programmi nello Start Menu) dovresti ritrovarti una serie di Build Environments che ti permettono di compilare nelle tre architetture e in due diverse modalitá, Debug e Release.

Alex_87_xelA
10-12-2008, 19:44
questo non devi farlo tu; é sufficiente che tu usi il tipo INT_PTR.

edit - a parte che neanche funzionerebbe perché quando é definita WIN64 é automaticamente definita anche WIN32, quindi casomai dovresti invertire l'#ifdef.



Perchè mi basta il puntatore ?

marko.fatto
10-12-2008, 19:59
ptr sta per portable..

Alex_87_xelA
10-12-2008, 20:02
ptr sta per portable..

:doh:

quindi è come questo ?

#ifdef WIN64
#define INT_PTR INT64
#else if defined WIN32
#define INT_PTR INT32
#endif

marko.fatto
10-12-2008, 20:50
no, o uno o l'altro..
è già portabile di suo, cioè se la macchina è a 64 bit gli interi sono a 64, se la macchina è a 32 bit gli interi sono a 32..

fero86
10-12-2008, 20:54
ptr sta per portable.. ptr sta per "pointer", che significa intero della dimensione di un puntatore, o del bus di indirizzi che dir si voglia.



:doh:

quindi è come questo ?

#ifdef WIN64
#define INT_PTR INT64
#else if defined WIN32
#define INT_PTR INT32
#endif ripeto... il tipo INT_PTR é giá definito, se tu scrivi una cosa simile in un tuo sorgente il preprocessore non fa altro che lamentarsi di una macro ridefinita.

Alex_87_xelA
10-12-2008, 21:00
no, o uno o l'altro..
è già portabile di suo, cioè se la macchina è a 64 bit gli interi sono a 64, se la macchina è a 32 bit gli interi sono a 32..

ah ... :doh:

quindi è tutto automatico ::: FORTE :D Minkia non lo sapevo (ma no :p !!!)

però pensandoci ... quello non serve se stai su un'architettura a 64 bits e vuoi fare un pogramma a 32 ... giusto ?

fero86
10-12-2008, 23:12
però pensandoci ... quello non serve se stai su un'architettura a 64 bits e vuoi fare un pogramma a 32 ... giusto ? no

l'architettura su cui avviene lo sviluppo non conta nulla se non per il testing (non puoi testare un eseguibile a 64 bit su un'architettura a 32 bit).

Alex_87_xelA
10-12-2008, 23:44
ptr sta per "pointer", che significa intero della dimensione di un puntatore, o del bus di indirizzi che dir si voglia.



ripeto... il tipo INT_PTR é giá definito, se tu scrivi una cosa simile in un tuo sorgente il preprocessore non fa altro che lamentarsi di una macro ridefinita.

no no ... l'avevo capito ... era per fare un esempio ... per vedere se quello era quello che si intendeva :sofico:

Alex_87_xelA
10-12-2008, 23:46
no

l'architettura su cui avviene lo sviluppo non conta nulla se non per il testing (non puoi testare un eseguibile a 64 bit su un'architettura a 32 bit).


cioè se la macchina è a 64 bit gli interi sono a 64, se la macchina è a 32 bit gli interi sono a 32..


:confused:

Alex_87_xelA
10-12-2008, 23:48
questo non devi farlo tu; é sufficiente che tu usi il tipo INT_PTR.


ricapitolando ... è un puntatore ad intero ... ora come fa a sapere se è a 32 o 64 bits l'intero che sto puntando ? presumo da quello che configuro nel Configuration Manager giusto ?

cdimauro
11-12-2008, 09:51
é vero che l'IL é sempre uguale (o almeno credo), ma non é vero che l'eseguibile é lo stesso per qualsiasi architettura: un eseguibile .NET é comunque un normalissimo eseguibile in formato PE/COFF e quindi puó essere a 32 bit o a 64 bit.
E' soltanto un contenitore. L'importante è l'assembly generato, che può essere ricompilato al volo per qualunque architettura per la quale esiste un runtime .NET.
ricapitolando ... è un puntatore ad intero ... ora come fa a sapere se è a 32 o 64 bits l'intero che sto puntando ? presumo da quello che configuro nel Configuration Manager giusto ?
INT_PTR non è un puntatore: è un intero che ha la stessa dimensione dei puntatori per la macchina target.

Alex_87_xelA
11-12-2008, 12:24
INT_PTR non è un puntatore: è un intero che ha la stessa dimensione dei puntatori per la macchina target.

Quindi è un intero (un numero) non un puntatore (indirizzo di memoria).

e che dimensione hanno i puntatori ? (sempre 32 o 64) ?

cdimauro
11-12-2008, 14:00
32 bit su macchine a 32 bit e 64 bit su macchine a 64 bit.

Alex_87_xelA
11-12-2008, 14:04
32 bit su macchine a 32 bit e 64 bit su macchine a 64 bit.

:D Logico