Come programmatore, che cosa ho bisogno di preoccuparsi di quando si passa a Windows a 64 bit?

StackOverflow https://stackoverflow.com/questions/544296

  •  23-08-2019
  •  | 
  •  

Domanda

La maggior parte del mio recente di programmazione è stato su Windows a 32 bit che utilizzano C / C ++ / C # / VB6. Ultimamente, i miei clienti stanno chiedendo se il mio codice verrà eseguito su Windows a 64 bit.

Mi chiedo quali caratteristiche legacy che potrebbero utilizzare che si romperà a 64 bit di Windows? Quali sono alcuni problemi del mondo reale ho bisogno di pensare e preoccuparsi?

Ovviamente, mi metterà alla prova il mio codice sul sistema operativo a 64 bit, ma mi piacerebbe sapere quali sono le questioni comuni a cercare. Sono più preoccupato con i binari esistenti, ma sono aperto ai commenti su ciò di cui preoccuparsi quando ricompilare (dove possibile).

EDIT: Ecco un bella lista di bug porting a 64 bit.

Altri suggerimenti

Per quanto mi riguarda, la cosa più importante circa il porting di codice C / C ++ per Windows a 64 bit è quello di testare l'applicazione con le allocazioni MEM_TOP_DOWN abilitato (valore del Registro AllocationPreference) come descritto in 4 Gigabyte di sintonia :

  

Per forzare le allocazioni allocare gli indirizzi superiori prima di indirizzi più bassi per scopi di test, specificare MEM_TOP_DOWN quando si chiama VirtualAlloc o impostare il seguente valore del Registro di 0x100000:

     

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Memory Management\AllocationPreference

Quando questo è importante?

  • Se avete già esistente EXE a 32 bit che sono state costruite con la /LARGEADDRESSAWARE opzione MSVC linker (o che hanno la bandiera IMAGE_FILE_LARGE_ADDRESS_AWARE impostato nelle intestazioni PE con altri mezzi, come ad esempio editbin.exe), quindi ottengono un pieno 4 GB di spazio di indirizzi virtuali in Windows a 64 bit, ed è necessario verificare con il valore del registro AllocationPreference impostato.
  • Se avete già esistente DLL a 32 bit che possono essere caricati da grandi indirizzi EXEs consapevoli, è necessario verificare con il set di valore di registro AllocationPreference.
  • Se si ricompila il codice C / C ++ in un EXE a 64 bit o DLL, è necessario verificare con il set di valore di registro AllocationPreference.

Se il vostro C / C ++ applicazione rientra in una di queste tre categorie e non si prova con le allocazioni MEM_TOP_DOWN, il test è molto improbabile per la cattura di eventuali bug puntatore troncamento / signedness nel codice.

La seconda cosa più importante, se si utilizzano MSVC e state ricompilando il codice C / C ++ a 64 bit, è quello di utilizzare l'opzione /Wp64 compilatore per il tuo a 64 bit costruire :

  • Questo farà sì che il compilatore ad emettere gli avvisi per typecasts che troncano puntatori o estendono tipi integrali più piccoli in puntatori (anche quando si utilizza reinterpret_cast o un cast C-style), così come un paio di altri problemi di porting a 64 bit.
  • Sì, il dice che invece di compilazione con /Wp64 voi dovrebbe usare un compilatore che gli obiettivi di una piattaforma a 64-bit, ma che da sola non prenderà questioni puntatore troncamento / estensione in fase di compilazione. Utilizzando un compilatore che si rivolge a 64 bit e che consente l'opzione /Wp64 compilatore per la costruzione a 64 bit cattura molte questioni puntatore troncamento / estensione in fase di compilazione, e questo vi farà risparmiare tempo nel lungo periodo.
  • Purtroppo, con MSVC 2008, questo produrrà anche un "avvertimento riga di comando" per ogni unità di traduzione dicendo che l'opzione /Wp64 è deprecato. Posso capire perché l'opzione è deprecata per 32 bit costruisce (dove si tratta di un trucco male che richiede annotare molte delle vostre typedef), ma è un peccato che è anche sconsigliato a 64 bit costruisce (dove in realtà è utile).

Potrebbe essere più facile di migrare il codice .NET se avete 100% "Tipo codice gestito al sicuro". Si può solo copiarlo nella piattaforma a 64 bit ed eseguirlo con successo sotto il CLR a 64 bit. Controllare questo MSDN link sulla migrazione Il codice gestito a 32 bit a 64 bit.

A proposito, Hanselman blogged sull'argomento di recente.

Se si sta parlando di programmi su 32 bit, allora si hanno praticamente nulla di cui preoccuparsi a partire da Windows 64 di loro verrà eseguito sotto emulazione a 32 bit. Eventuali problemi con le future versioni di Windows (per esempio Windows 7) sono suscettibili di essere incompatibilità piuttosto che problemi con un sistema operativo a 64 bit.

Tuttavia, se il codice gestito viene compilato per la piattaforma di destinazione "Qualsiasi CPU" e di effettuare chiamate in codice non gestito (es PInvoke), o si dipenda da altri assembly poi ci sono alcune cose da tenere presente. di posta sulla x86 / x64 Scott Hanselman CLR copre questo ed è una buona spiegazione del CLR su Win32 / 64.

Quando si sviluppa a 64 bit programmi nativi poi il Programmazione guida a 64 bit di Windows è una buona guida. Si tratta in gran parte verso il basso per i puntatori e la dimensione dei tipi di dati:)

programmi a 32 bit funzioneranno bene su 64 bit di Windows. Finché non si sta facendo alcun tipo di driver di periferica di sviluppo del corso.

Se si compila il software come software a 64 bit per la prima volta, è necessario prendersi cura di seguito:

  • un puntatore, 64 bit, mentre un int è 32 bit. Non memorizzare i puntatori a int, il codice si romperà.
  • processo
  • 64 bit bisogno di 64 DLL bit. Se si dipende da terza parte DLL, assicurarsi che essi sono forniti anche in 64 bit. Se avete bisogno di comunicare tra un processo a 32 bit e un processo a 64 bit, avrete bisogno di alcuni dei molti modi diversi di IPC su Windows. Chiamare direttamente le funzioni è fuori questione.
  • Le directory di sistema di Windows a 64 bit sono diverse rispetto a 32 bit di Windows. Se si dispone di alcuni percorsi hard coded, potrebbe essere necessario controllare di nuovo.

Se si fa l'iniezione DLL per qualsiasi motivo, si avrà difficoltà.

Da un C / C ++ prospettiva ....

Una cosa ovvia è che la dimensione di un int diventerà 8 byte invece di 4 byte. Se uno qualsiasi del vostro codice è dipendente che si possono ottenere risultati imprevisti. Struttura e allineamenti variabili possono spostarsi. Si può essere in grado di superare con un pacchetto #pragma, ma io non sono molto fluente in allineamenti ed imballaggio.

Se si utilizzano i sindacati con interi in loro, il comportamento può cambiare.

Se si utilizza qualsiasi struttura BITFIELD, sulla base int l'extra di 32 bit può causare confusione. Il bit di segno non sarà in cui si pensava che fosse.

Se il codice qualsiasi costanti esadecimali e si aspettano indicazioni per andare negativo, si possono avere problemi. Esempio 0x8000000 è un numero negativo come un log, o 32 bit numero intero. 0x80000000 come numero intero su una piattaforma a 64 bit è un numero positivo. per impostare direttamente il bit di segno che si dovrebbe usare 0x80000000 00000000 (spazio incorporato per migliorare la leggibilità solo)

Inoltre mi aspetto size__t a crescere in modo appropriato. Se si stanno facendo eventuali assegnazioni basate su MAX_INT, saranno molto più grandi.

Per evitare questo tipo di anomalie dimensioni, io in genere bastone con anela al posto di INT.

è l'emulazione 32 bit davvero a prova di proiettile? Ho visto che il Registro è spiegate un po 'diverso. Mi chiedo solo ciò che le cose tipiche non funzionano ...

Inoltre, il C: \ windows \ system32 può contenere solo le DLL a 64 bit. Se si dispone di una DLL a 32 bit, è necessario metterlo in C: \ windows \ syswow64 \

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top