Punti da considerare per la scrittura di codice che è compatibile con entrambi i 32 e 64 architetture bit

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

  •  20-09-2019
  •  | 
  •  

Domanda

Quali sono i punti che dovrebbero essere tenute a mente durante la scrittura di codice che dovrebbe essere portabile su entrambe le macchine a 32 bit e 64 bit?

Pensando di più su questo, mi sento se è possibile aggiungere la vostra esperienza interms dei problemi affrontati, che avrebbe aiutato.

L'aggiunta ulteriormente su questo, una volta ho affrontato un problema a causa di un prototipo mancante per una funzione che stava tornando restituire un puntatore. Quando ho portato la stessa ad una macchina a 64 bit, il codice è stato crash e ho avuto alcun indizio circa la ragione per un bel po 'di tempo, poi si rese conto che tutti i prototipi mancanti si presume per tornare int la causa del problema.

Tali esempi possono aiutare.

EDIT:. In aggiunta a wiki comunità

È stato utile?

Soluzione

trucchi:

  1. puntatori Casting al numero intero tipi è pericoloso
  2. dimensioni struttura dati possono cambiare
  3. Attenzione per estensione del segno
  4. Diverso ABI?

Alcuni trucchi e suggerimenti che ho trovato utile:

  1. Procuratevi un tipo nativo-size intero (da un'intestazione o typedef il proprio) e utilizzarlo quando si dispone di variabili che non si preoccupano dimensioni.
  2. Utilizzare i tipi di variabili esplicite per quanto possibile (u_int64_t, int_32_t, ecc.)

Altri suggerimenti

  • Alcuni tipi integrali possono avere dimensioni diverse
  • I puntatori sono di diverse lunghezze
  • Imbottitura struttura
  • Allineamento

In Windows, c'è solo convenzione di chiamata su x64 in contrapposizione al multiplo su una macchina x32 regolare.

Le cose ottenere più torbida quando si dispone di alcuni componenti che sono a 32-bit e un po 'a 64-bit. Su Windows, ho finito per scrivere un servizio COM per farli parlare.

Spingendo puntatori sullo stack occupa il doppio dello spazio. dimensione dello stack non può cambiare tra le versioni del sistema operativo, però, che causa il codice che viene eseguito bene in a 32 bit a fallire misteriosamente quando compilato ed eseguito invariato a 64 bit. Non chiedetemi come lo so questo.

sizeof (int) forza! = Sizeof (void *)

allineamento. La sua possibile che allineamenti esigenze potrebbero cambiare. Questo può esporre i bug in cui v'è stato maltrattando le cose che dovrebbero essere stati allineati, ma sono stati allineati solo per caso a 32 bit (o su un processore che non si preoccupa)

dont passare 0 in varargs se il ricevitore si aspetta un puntatore. Questo è doloroso in C ++ in cui sviluppatori esperti sanno che 0 è un puntatore nullo valida. Un dev C di solito usare NULL quindi si sono probabilmente OK

Scrivi test automatizzati ed eseguire regolarmente su entrambe le piattaforme.

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