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
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.
struct A pack(4)
{
short j;
char i;
};
voidOnStart()
{
Print(sizeof(A)); // 4
}
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.
Igor Makanu:
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
Der physische Speicher ist ähnlich.
struct A pack(4)
{
short j;
char i;
};
voidOnStart()
{
Print(sizeof(A)); // 4constint handle = FileOpen(__FILE__, FILE_WRITE | FILE_BIN);
if (handle != INVALID_HANDLE)
{
A a = {0};
FileWriteStruct(handle, a);
Print(FileTell(handle)); // 4FileClose(handle);
}
}
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 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.
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
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
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.