Sehen Sie sich die %code% struct:
an %Vor%Aufgrund der Ausrichtung der Datenstruktur kann die Adresse von %code% gezwungen sein, sich an die Adresse eines Vielfachen der Wortgröße anzupassen. Daher werden mehrere nicht verwendete Bytes zwischen %code% und %code% aufgefüllt. Das sind die Bytes, die nicht initialisiert und somit von Valgrind gemeldet wurden.
Um das Problem zu umgehen, könnten Sie das Initialisieren der gesamten Struktur durch %code% erzwingen.
%Vor%Obwohl @timrau ziemlich genau beschrieben hat, was das Kernproblem hier ist (Ausrichtung / Packen), bin ich kein Fan der vorgeschlagenen Lösung.
Sie haben eine %code% in Ihrem Code als %code% und %code% beschrieben. Die Größe der tatsächlichen Datenstruktur im Speicher ist jedoch nicht %code% , und das ist das Kernproblem.
Die vorgeschlagene Lösung schlägt vor, einfach alle Bits der %code% -Struktur zu löschen, bevor die wichtigen Bits eingefügt werden. Das Problem, das ich damit habe, ist sowohl ein semantischer als auch ein technischer - die Größe der Datenstruktur, die über den Draht gesendet wird, ist keine genaue Darstellung dessen, was Sie im Code modelliert haben. Mit anderen Worten, Sie senden nicht nur eine %code% und eine %code% - Sie senden eine %code% , eine %code% und einige andere cruft (padding).
Mein Vorschlag ist es, den Crust loszuwerden und nur das zu senden, was Sie in Ihrem Code modelliert haben.
Es gibt keine direkte Unterstützung in C ++, um Ausrichtung und Auffüllung auszuschalten, aber alle mir bekannten Compiler bieten einen einfachen Mechanismus, um Datenstrukturen auf %code% bytes auszurichten:
%Vor%Dadurch wird die %code% -Datenstruktur genau , was Sie in Ihrem Code modelliert haben, ohne Auffüllung. Dadurch wird %code% unnötiger Zugriff und Sie senden genau %code% byte über die Verbindung.
Ich habe Valgrind verwendet, um nach Speicherlecks in meinem Code zu suchen. Obwohl keine Speicherlecks gefunden werden, werden einige Fehler gemeldet, die alle auf einer einzigen Funktion / Klassenmethode beruhen:
%Vor%Das %code% , auf das die Fehler zeigen, ist Teil von %code% class:
%Vor%Ich sehe nicht, was das Problem ist. Wo genau sind die nicht initialisierten Werte? Oder sollte ich einfach die von Valgrind gemeldeten Fehler ignorieren?
Ich habe Valgrind verwendet, um nach Speicherlecks in meinem Code zu suchen. Obwohl keine Speicherlecks gefunden werden, werden einige Fehler gemeldet, die alle auf einer einzigen Funktion / Klassenmethode beruhen:
%Vor% Das sendMsg(const char _type, const double _value)
, auf das die Fehler zeigen, ist Teil von unix_socket
class:
Ich sehe nicht, was das Problem ist. Wo genau sind die nicht initialisierten Werte? Oder sollte ich einfach die von Valgrind gemeldeten Fehler ignorieren?
Sehen Sie sich die MESSAGE
struct:
Aufgrund der Ausrichtung der Datenstruktur kann die Adresse von value
gezwungen sein, sich an die Adresse eines Vielfachen der Wortgröße anzupassen. Daher werden mehrere nicht verwendete Bytes zwischen MESSAGE::type
und MESSAGE::value
aufgefüllt. Das sind die Bytes, die nicht initialisiert und somit von Valgrind gemeldet wurden.
Um das Problem zu umgehen, könnten Sie das Initialisieren der gesamten Struktur durch memset()
erzwingen.
Obwohl @timrau ziemlich genau beschrieben hat, was das Kernproblem hier ist (Ausrichtung / Packen), bin ich kein Fan der vorgeschlagenen Lösung.
Sie haben eine MESSAGE
in Ihrem Code als char
und double
beschrieben. Die Größe der tatsächlichen Datenstruktur im Speicher ist jedoch nicht sizeof(char) + sizeof(double)
, und das ist das Kernproblem.
Die vorgeschlagene Lösung schlägt vor, einfach alle Bits der MESSAGE
-Struktur zu löschen, bevor die wichtigen Bits eingefügt werden. Das Problem, das ich damit habe, ist sowohl ein semantischer als auch ein technischer - die Größe der Datenstruktur, die über den Draht gesendet wird, ist keine genaue Darstellung dessen, was Sie im Code modelliert haben. Mit anderen Worten, Sie senden nicht nur eine char
und eine double
- Sie senden eine char
, eine double
und einige andere cruft (padding).
Mein Vorschlag ist es, den Crust loszuwerden und nur das zu senden, was Sie in Ihrem Code modelliert haben.
Es gibt keine direkte Unterstützung in C ++, um Ausrichtung und Auffüllung auszuschalten, aber alle mir bekannten Compiler bieten einen einfachen Mechanismus, um Datenstrukturen auf N
bytes auszurichten:
Dadurch wird die MESSAGE
-Datenstruktur genau , was Sie in Ihrem Code modelliert haben, ohne Auffüllung. Dadurch wird memset
unnötiger Zugriff und Sie senden genau sizeof(char) + sizeof(double)
byte über die Verbindung.
Tags und Links c++ sockets memory-alignment valgrind