Fehler, Irrtümer, Fragen - Seite 2499
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich möchte der Sache gerne auf den Grund gehen.
Datenausrichtung ist nicht
Dies geschieht offenbar unter Berücksichtigung der internen Verwendung von sizeof(), d.h.sizeof() berücksichtigt nicht den physischen Speicher, sondern summiert einfach jeden Typ in Bytes
Ausrichtung ist eine Anordnung von Daten im physischen Speicher, wie in der Hilfe geschrieben "auf die importierten DLL-Funktionen zu übertragen" - in verschiedenen Compilern und Sprachen Datentypen können in der Größe oder vielmehr, wie sie im Speicher gespeichert werden, so müssen Sie struct A pack(4) zu verwenden, so dass jedesMitglied der Struktur "nicht über seine Box klettern" - Bytes
So sieht es auf dem Hubra in dem Artikel aus:
1 Byte: ch
2 Byte: leer
3 Byte: leerTHIS istchar ch
4 Byte: leer
5 Byte: Wert[0]
6 Byte: Wert[1]DIES istint-Wert;
7 Byte: Wert[2]
8 Byte: Wert[3]
Dies geschieht offenbar, um der internen Verwendung von sizeof() Rechnung zu tragen, d.h.sizeof() berücksichtigt nicht den physischen Speicher, sondern summiert einfach jeden Typ in Bytes
Das ist nicht der Fall.
Dies ist nicht der Fall.
dann hat Ihr Beispiel überprüft, dass sizeof() das "Gewicht" der Struktur in Bytes korrekt gezählt hat,
das einzige, was noch zu überprüfen ist physischen Speicher, aber meiner Meinung nach wird es nur funktionieren, wenn der Aufruf dll, nicht die Tatsache, dass die Entwickler nicht über-optimiert Datenspeicherung im Speicher ;) - d.h. wenn pack(4) nicht wie vorgesehen im Code verwendet wird, kann es im ausführbaren Code ignoriert werden
dann hat Ihr Beispiel überprüft, dass sizeof() das "Gewicht" der Struktur in Bytes korrekt gezählt hat
Deshalb stellt sich die Frage: Wie funktioniert das Alignment eigentlich? Die Dokumentation und Habr haben den Algorithmus mit ihren Beispielen nicht offengelegt.
Das Einzige, was noch zu prüfen ist, ist der physische Speicher, aber meiner Meinung nach wird es nur funktionieren, wenn der Aufruf dll, nicht die Tatsache, dass die Entwickler nicht über-optimiert Datenspeicherung im Speicher ;) - d.h. wenn pack(4) nicht wie vorgesehen im Code verwendet wird, kann es im ausführbaren Code ignoriert werden
Das wirft die Frage auf, wie die Angleichung eigentlich funktioniert. Die Dokumentation und hubr haben den Algorithmus mit ihren Beispielen nicht offengelegt.
es hängt vom jeweiligen Compiler ab, vielleicht können Sie in MQL Union ausprobieren, um zu sehen, wie die Daten bei der Verwendung vonpack(4) gespeichert wurden
Es hängt vom jeweiligen Compiler ab. Sie können wahrscheinlich versuchen, in union in MQL nachzusehen, wie die Daten bei Verwendung von pack(4) gespeichert wurden.
Es gibt Offsets und andere Möglichkeiten, dies zu tun.
HH Es stellt sich heraus, dass die Festlegung der Ausrichtung dazu dient, sie eindeutig zu machen. Aber nicht für den Eigengebrauch. Nun, und es ist klar ersichtlich, dass die Reihenfolge der Felder den Speicherverbrauch und offenbar auch die Leistung beeinflusst.
HH Es stellt sich heraus, dass die Einstellung der Ausrichtung der Eindeutigkeit dient. Aber nicht für den Eigengebrauch.
und das ist"es hängt alles vom jeweiligen Compiler ab" - Entwickler wenden oft Tricks an, um die Leistung ihrer Entwicklungen im Vergleich zu anderen zu verbessern, es gibt keine Compiler-Direktiven in MQL - wie die Deaktivierung der Quellcode-Optimierung usw. - Sie können den Unterschied in der Leistung oder der RAM-Nutzung des nativen Codes nicht erkennen
SZZ: Ich bin mir nicht sicher, ob das Beispiel mit dem Schreiben in eine Datei immer korrekt funktioniert, jemand hat kürzlich geschrieben, dass MQL beim Schreiben in eine Datei die Win-API verwendet, möglicherweise werden einige Annahmen für die Kompatibilität mit API-Funktionen gemacht - aber das ist meine Vermutung, ich bin kein Compiler-Entwickler (((
Es gibt auch andere Möglichkeiten, dies zu tun.
Es stellt sich heraus, dass die Festlegung einer Ausrichtung dazu dient, diese eindeutig zu machen. Aber nicht für den Eigengebrauch. Sie können sehen, dass die Reihenfolge der Felder den Speicherverbrauch beeinflusst.
Sie graben irgendwo falsch, Ausrichtung ist nicht für Sie überhaupt benötigt, ist es für Prozessor nicht einige int auf zwei Cache-Linien zu bekommen benötigt. Der Ort, an dem der Abruf erfolgt, ist nicht geregelt und hängt vom Compiler ab, so dass man sich bei der Übertragung nach außen nicht auf pack() verlassen kann, sondern nur auf den manuellen Abruf.
Sie graben irgendwo falsch, Ausrichtung ist nicht notwendig für Sie überhaupt, es ist notwendig für Prozessor nicht einige int auf zwei Cache-Linien zu bekommen. Der Ort, an dem die Hinzufügung vorgenommen wird, ist nicht geregelt und hängt vom Compiler ab, so dass man sich bei der Übertragung nach außen nicht auf pack() verlassen kann, sondern nur auf manuelles Hinzufügen.
Es wurde klar, danke an alle.
Ich möchte der Sache auf den Grund gehen.
Was gibt es da herauszufinden, wenn in der Dokumentation eindeutig steht
Der Strukturname kann nicht als Bezeichner (Variablen- oder Funktionsname) verwendet werden. Bitte beachten Sie, dass in MQL5 die Elemente einer Struktur direkt aufeinander folgen , ohne Ausrichtung. In C++ wird eine solche Angabe an den Compiler mit der Option
Und so weiter...
Es gibt also überhaupt keine Ausrichtung in MQL5.