Fehler, Irrtümer, Fragen - Seite 2499

 
fxsaber:

Ich möchte der Sache gerne auf den Grund gehen.

Datenausrichtung ist nicht

Print(sizeof(A)); // 2

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:

struct Foo
{
    char ch;
    int value;
};

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]


 
Igor Makanu:

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;
};

void OnStart()
{
  Print(sizeof(A)); // 4
}
 
fxsaber:

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

 
Igor Makanu:

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;
};

void OnStart()
{
  Print(sizeof(A)); // 4
  
  const int handle = FileOpen(__FILE__, FILE_WRITE | FILE_BIN);
  
  if (handle != INVALID_HANDLE)
  {
    A a = {0};
    
    FileWriteStruct(handle, a);
    Print(FileTell(handle)); // 4
    
    FileClose(handle);
  }
}
 
fxsaber:

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

 
Igor Makanu:

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.

 
fxsaber:

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 (((

 
fxsaber:

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.

 
Vict:

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.

 
fxsaber:

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

#pragma  pack(1)

Und so weiter...

Es gibt also überhaupt keine Ausrichtung in MQL5.

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...