Punkte werden für das Schreiben von Code in Betracht gezogen, die sowohl tragbar ist auf 32- und 64-Bit-Architekturen

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

  •  20-09-2019
  •  | 
  •  

Frage

Was sind die Punkte, die im Auge behalten werden sollte, während das Schreiben von Code, der auf den beiden 32-Bit und 64-Bit-Maschinen tragbar sein sollte?

mehr dazu denken, ich fühle mich, wenn Sie Ihre Erfahrungen anhand der Begriffe Problemen konfrontiert hinzufügen können, das helfen würde.

Hinzufügen von weiteren dazu, ich einmal ein Problem aufgrund eines fehlenden Prototyp für eine Funktion gegenüber, die einen Zeiger zurückkehren zurückkehren. Wenn ich das gleiche auf eine 64-Bit-Maschine portiert wurde der Code abstürzt und ich hatte keine Ahnung, über den Grund für einige Zeit später erkannte, dass alle fehlenden Prototypen Rückkehr int das Problem verursacht angenommen werden.

Jede solche Beispiele helfen kann.

EDIT:. Das Hinzufügen Community Wiki

War es hilfreich?

Lösung

Gotchas:

  1. Casting Zeiger auf Integer-Typen ist gefährlich
  2. Größen Datenstruktur
  3. ändern
  4. Achten Sie auf Zeichen Erweiterung
  5. Verschiedenes ABI?

Einige Tipps & Tricks Ich habe nützlich gefunden:

  1. Holen Sie sich eine native-size Integer-Typ (von einem Kopf- oder typedef eigenen) und es verwenden, wenn Sie Variablen haben, die über die Größe egal.
  2. Verwenden Sie explizite Variablentypen, wo immer möglich (u_int64_t, int_32_t usw.)

Andere Tipps

  • Einige integrale Typen können unterschiedliche Größen haben
  • Pointers sind unterschiedlich lang
  • Struktur padding
  • Ausrichtung

Unter Windows gibt es nur Konvention auf x64-Aufruf in Bezug auf die mehrfach auf einer regelmäßigen x32 Maschine gegenüber.

Die Dinge werden trüber, wenn Sie einige Komponenten haben, die 32-Bit sind und einige 64-Bit. Unter Windows endete ich einen COM-Dienst zu schreiben, um sie zu reden zu bekommen.

Pushing Zeiger auf den Stapel dauert doppelt so viel Platz. Stack-Größe allerdings nicht zwischen OS-Versionen ändern, Code verursacht, dass feine Läufen in 32-Bit auf mysteriöse Weise fehlschlagen, wenn kompiliert und unverändert auf 64-Bit laufen. Frag mich nicht, wie ich das wissen.

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

Ausrichtung. Es ist möglich, dass Ausrichtungen Anforderungen ändern könnten. Dies kann Fehler zu, wo man die Dinge schlecht zu behandeln war, die ausgerichtet werden sollen, wurden aber nur durch Zufall in 32 Bit (oder auf einem Prozessor das tut Pflege)

ausgerichtet

Dont Pass 0 in varargs, wenn der Empfänger erwartet einen Zeiger. Das ist schmerzhaft in C ++, wo versierte Entwickler wissen, dass 0 ein gültiger Nullzeiger. Ein C Entwickler wird in der Regel NULL verwenden, so dass Sie wahrscheinlich OK

sind

Schreiben automatisierte Tests und führen sie regelmäßig auf beiden Plattformen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top