Was ist der beste Weg, um 128-Bit-Ganzzahlen (derzeit __uint128_t) mit Python-Ctypes zu unterstützen?
Eine benutzerdefinierte Struktur von zwei uint64_t ist vielleicht, aber dies wird Ausrichtungsprobleme verursachen, wo das erforderlich ist.
Irgendwelche Gedanken darüber, warum ctypes nicht erweitert wurde, um 128-Bit-Ganzzahlen zu unterstützen?
Wenn Sie wirklich mit 128-Bit Ganzzahlen arbeiten möchten, brauchen Sie sich keine Gedanken über die Ausrichtung zu machen. Keine aktuelle Architektur, keine Maschine, auf der Python läuft, unterstützt native 128-Bit-Ganzzahlarithmetik. Somit würde keine Maschine 128-Bit-Ganzzahlen erfordern, die 16-Byte-ausgerichtet sind. Verwenden Sie einfach diese benutzerdefinierte Struktur und Sie werden in Ordnung sein.
Wenn Sie wirklich nach Unterstützung für 128-Bit vector -Typen fragen, müssen Sie diese wahrscheinlich ausrichten. Das heißt, Sie müssen sie ausrichten, wenn Sie sie in Python-Code erstellen und sie mit Verweis auf C / C ++ - Code übergeben. Sie können sie nicht zuverlässig nach Wert übergeben. Es gibt keine Möglichkeit, ctypes korrekt auf dem Stack auszurichten (falls dies von der Architektur-ABI gefordert wird). Vektoren, die von C / C ++ an Python übergeben werden, sind vermutlich bereits richtig ausgerichtet. Also, wenn Sie es so arrangieren können, dass alle Ihre Vektoren in C / C ++ - Code zugeordnet sind, sollten Sie auch mit Ihrer benutzerdefinierten Struktur in Ordnung sein.
Angenommen, Sie müssen ausgerichtete Vektoren in Python-Code erstellen, dann habe ich Code für ausgerichtete Ctypes-Arrays eingefügt. Ich habe auch Code, um andere Ctypes-Typen, die ich nicht in die Code-Größe aufgenommen habe, vernünftig auszurichten. Arrays sollten für die meisten Zwecke ausreichen. Diese ausgerichteten Arrays haben einige Einschränkungen. Sie werden nicht korrekt ausgerichtet, wenn Sie sie als Wert an C / C ++ - Funktionen übergeben oder wenn Sie sie als Mitglieder in einer Struktur oder einer Vereinigung einschließen. Sie können ausgerichtete Arrays von ausgerichteten Arrays mit dem Operator *
erstellen.
Verwenden Sie aligned_array_type(ctypes-type, length, alignment)
, um neue ausgerichtete Array-Typen zu erstellen. Verwenden Sie aligned_type(ctypes-type, alignment)
, um eine ausgerichtete Version eines bereits vorhandenen Array-Typs zu erstellen.