Problem: doubles werden nan
-
Ringding schrieb:
unbenamt schrieb:
fst dword [ebx+1]
Das gehört ja verboten! Außer (ebx+1) ist dword-aligned, was sehr unwahrscheinlich ist.
ich weis nicht genau was du meinst. Die adresse ist doch in bytes und nicht in dwords. Auch wenn dword davor steht...
-
Non-aligned load/store ist saulangsam.
-
Wie non-aligned? Das ist doch byte-aligned oder? Aber wie soll man es denn sonst machen? Man brauch doch einen pointer, oder? Und der ist nunmal byte-aligned.
Ich weis im moment nicht was du meinst. Vielleicht steh ich auch einfach nur auf der leitung...
-
dword load/stores sollten auch dword-aligned sein, sonst wirds langsam (zwei bus-zyklen statt einem). ich hab mir den kommentar verkniffen, weil ja nicht bekannt ist, wohin ebx hier zeigt.
-
ebx zeigt auf ein element in einer struktur die der asm funktion von C aus übergeben wird. Aber wie soll ich es schaffen, dass es word-aligned ist? Wo es liegt hängt doch davon ab, was malloc in C returnt. Und wenn das halt zufällig nicht word aligned ist (also ihr meint ebx%2==0, denk ich, oder?) kann ich auch nicht einfach ein byte dazuaddieren.
-
Wir reden von dword-aligned. Also ebx%4==0. Wenn das von malloc und einem Zeiger auf ein struct-Element kommt, dann ist es immer aligned, sofern das struct-Element z.B. ein single ist. Wie kommst du überhaupt auf diese +1?
-
Ach ja natürlich %4 - klar
Das +1 kommt weil ich das erste byte in der struktur überspringe. Die struktur hab ich mit attribute-pack gemacht - das heisst jeder wert ist wirklich so gross wie man ihn braucht. nicht dass jeder char 4 bytes braucht.
Dann ist die double-var warscheinlich nichtmehr dword-aligned. Macht das was? Ist das wirklich viel langsamer?
Eigentlich könnte man doch viel platz sparen, wenn man jede struktur packt, oder? Ich meine - mehr als die hälfte meiner variablen sind kleiner als 4 byte. Und wenn ich die struktur 100 mal erzeuge kann man doch viel platz sparen, oder?
Das ist ja blöd dass es dann langsamer wird...
-
platz verschwendest du ohne #pragma pack u.ä. nur, wenn du datenfelder unterschiedlicher grösse wild durcheinanderwürfelst, wenn die reihenfolge der daten nicht durch irgendetwas anderes bedingt ist, sortierst du sie am besten nach grösse, grosse felder zuerst. auf diese weise kommt es höchtens am ende der struktur zum padding. und ja, der unterschied kann enorm sein.
-
Also ich hab mir gedacht, wenn ich die struktur von assembler aus verwende ist es besser wenn der kompiler nicht's mitzureden hat an der verteilung.
Sollte ich irgendwie spacer-bytes einfügen? Bringt das was?
-
Normalerweise macht man sowas ziemlich umständlich, indem man ein kleines Hilfsprogramm macht, das die Offsets der einzelnen Felder in ein Include-File reinschreibt. Dieses Programm wird beim Build-Prozess ausgeführt, und der asm-Teil verwendet dann die Offsets aus dem Include-File. Dadurch kann der Compiler das zusammenstoppeln, wie er will.
Wenn du willst, kannst du natürlich die struct auch mit pragma pack machen, aber dann musst du halt selber auf's alignment achten.
-
genau! ich hab sie mit #pragma pack gemacht.
Ja, dann muss ich wohl selber auf das alignment achten, das stimmt.