memory-alignment

Speicherausrichtung bedeutet, dass sich Objekte und Variablen an bestimmten Offsets im Systemspeicher befinden.
7
Antworten

Suchen Sie nach Lücken in C-Strukturen aufgrund der Ausrichtung

Gibt es eine Möglichkeit in gcc oder clang (oder irgendeinem anderen Compiler) Informationen darüber auszuspucken, ob eine Struktur Löcher (Speicherausrichtung) enthält? Danke. ps: Wenn es eine andere Möglichkeit gibt, es zu tun, bitte inf...
06.10.2011, 12:17
1
Antwort

Was sind die Unterschiede zwischen #pragma pack (push, n) / # pragma pack (pop) und __attribute __ ((__ packed__, aligned (n))) auf GCC?

Was sind die Unterschiede zwischen den beiden folgenden Vorgehensweisen bei GCC (das heißt, beide mit GCC kompilieren)? %Vor% und: %Vor% Sie scheinen sich
30.10.2015, 13:33
2
Antworten

___ answer19365033 ___

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%     
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ answer19365569 ___

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.

    
___ tag123sockets ___ Ein Endpunkt eines bidirektionalen Interprozess-Kommunikationsflusses. Dies bezieht sich oft auf einen Prozessablauf über eine Netzwerkverbindung, ist jedoch keineswegs darauf beschränkt. Nicht zu verwechseln mit Websocket (einem Protokoll) oder anderen Abstraktionen (z. B. socket.io). ___ tag123valgrind ___ valgrind ist ein dynamisches Analysetool für Linux-, OS X-, Android- und Solaris-Systeme. Es kann zum Profilieren sowie zum Auffinden von Speicherlecks, Race-Conditions und Threading-Fehlern verwendet werden. ___ tag123memoryalignment ___ Speicherausrichtung bedeutet, dass sich Objekte und Variablen an bestimmten Offsets im Systemspeicher befinden. ___ qstntxt ___

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...
14.10.2013, 16:37
4
Antworten

Doppelte Ausrichtung

Nach der Diskussion von diesem Beitrag habe ich verstanden, dass der Hauptgrund dafür Die Ausrichtung der Strukturelemente ist Leistung (und einige Einschränkungen der Architektur). Wenn wir Microsoft (Visual C ++), Borland / CodeGear (C ++...
19.06.2012, 19:50
5
Antworten

C (++) struct erzwinge zusätzliches Padding

Ich habe zahllose Fragen der Form "Ich mag keine Auffüllung, wie schalte ich es aus" gesehen, aber habe noch nichts darüber gefunden, den Compiler zu zwingen, zusätzliche Auffüllung zu bieten. Der spezielle Fall, dass ich wie aussieht %Vor%...
22.06.2012, 16:41
1
Antwort

Wie richtet man std :: array enthaltene Daten aus?

Da std::array nicht zulässt, seinen Zuordner zu ändern, gibt es eine Möglichkeit, sicherzustellen, dass der Zeiger auf die Datenadresse ausgerichtet ist? Zum Beispiel, in GNU g ++ 4.8.4 und 6.1.0, der Code unten %Vor% stellt die folgen...
20.08.2016, 21:26
2
Antworten

Zuweisung von initialisiertem, ausgerichtetem Speicher

Ich schreibe ein Programm (in C ++), in dem ich Arrays zuweisen muss, deren Startadressen mit der Cache-Zeilengröße übereinstimmen sollen. Wenn ich diese Arrays zuteile, möchte ich auch, dass der Speicher auf Null initialisiert wird. Momentan...
17.12.2012, 04:56
4
Antworten

Benennung von Array-Elementen oder Struktur und Array innerhalb einer Union

Betrachten Sie die folgende Struktur: %Vor% Es scheint mir, dass ich in WinApis IPAddress-Struktur etwas Ähnliches gesehen habe. Die Idee ist, mir die Möglichkeit zu geben, die Array-Komponenten sowohl nach Index als auch nach Namen zu verwe...
23.06.2011, 10:10
1
Antwort

Warum ist das Ausrichten von langen long union member größer als die beinhaltende union / struct? Ist das richtig?

Aus dieser Frage könnte man anfangen zu glauben, dass die Ausrichtung einer Gewerkschaft dies nicht ist weniger als die größte Ausrichtung seiner einzelnen Mitglieder. Aber ich habe ein Problem mit dem long long -Typ in gcc / g ++. Das voll...
06.08.2012, 08:48
2
Antworten

C können Zeiger mit jedem anderen Datentyp ausgerichtet werden?

Ich habe ein gezacktes mehrdimensionales Array implementiert, indem ich den Platz für die Zwischenfelder sowie die tatsächlichen Elemente im 1 großen Block zugewiesen habe. Während ich daran arbeitete, dachte ich, dass ich die Ausrichtung de...
31.12.2014, 04:50