Wie viele bytes hat char definiert in einer Struktur nehmen?
Wenn ich ein Zeichen definieren geben Sie eine Struktur, es scheint, nehmen die mehr als 1 byte; in der Tat, es scheint, nehmen die 4 bytes.
Unten ist mein Programm:
#include <stdio.h>
int main(void)
{
struct book{
char name;
float price;
int pages;
};
struct book b1={'B',130.00,550};
printf("\nAddress of structure:%u",&b1);
printf("\nAddress of character name:%u",&b1.name);
printf("\nAddress of float price:%u",&b1.price);
printf("\nAddress of integer pages:%u",&b1.pages);
printf("\n\n");
return 0;
}
Wenn ich das Programm, bekomme ich die folgenden Ausgabe:
Address of structure:557762432
Address of character name:557762432
Address of float price:557762436
Address of integer pages:557762440
Warum ist es, dass ich den Unterschied von 4 bytes zwischen Adresse der Variablen "name" und die variable "Preis"?
Dem system, auf dem dieses Programm ausgeführt wird, x86_64 bit arch Fedora-14.
Der compiler ist die Verpackung der Struktur, so dass die Daten der Mitglieder richtig ausgerichtet sind und das Programm schnell laufen kann. Mit schlechten Ausrichtung einige chips(ARM) nur scheitern, andere (x86) laufen Sie einfach langsamer.
In 64-bit-Computer-Speicher-Wort erstellt von 64 bit, wie es war, 32-bit für 32-bit-Adresse x86_64
Vielen Dank für Ihre Antworten, Lesen Sie mehr über Polsterung
In 64-bit-Computer-Speicher-Wort erstellt von 64 bit, wie es war, 32-bit für 32-bit-Adresse x86_64
Vielen Dank für Ihre Antworten, Lesen Sie mehr über Polsterung
InformationsquelleAutor mrashok | 2012-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
C-standard ermöglicht Implementierungen, um zusätzliche Polsterung bits, um die Strukturen, um so den Zugriff auf die Struktur schneller, indem es ausgerichtet auf byte-Grenzen, wie Sie durch die Umsetzung.
Dies ist bekannt als Struktur-Polsterung.
Gegeben, die über die Größe einer Struktur kann nicht das gleiche wie die Summe der Größen der einzelnen Mitglieder. Sie sollten immer
sizeof
bestimmen die Größe der Struktur.Auch, die oben erwähnt ist der Grund dafür, dass Sie nicht sehen, die Strukturen, die Mitglieder bei Speicher-Adressen, die Sie von Ihnen erwarten zu sein.
Kein Problem 🙂 Do akzeptieren Sie eine Antwort, die Sie sich Antworten auf Ihre Frage in der besten Weise.
InformationsquelleAutor Alok Save
Sie in Ausrichtung Regeln. Dies ist ein sehr compiler - und system-spezifische Sache, aber standardmäßig (das heißt, wenn Sie nichts anderes angeben mit compiler-flags oder eine spezielle Ausrichtung von Anforderungen im code) GCC auf Linux x64 richtet jedes Feld eines struct auf ein Vielfaches seiner Größe. Also, ein ein-byte-Zeichen hat nichts zu kümmern, für die Ausrichtung. Jedoch, ein int oder float ist immer auf eine 4-byte-Grenze, und ein double ist immer eine 8-byte-Grenze. Das ist, was Sie hier zu sehen.
Als Ethan Hinweise oben in den Kommentaren, einige Prozessoren nicht sogar Zugriff auf Speicher-Objekte, die nicht ausgerichtet auf eine bestimmte Weise, und Intel-Prozessoren wird der Zugriff auf den Speicher sehr viel langsamer, wenn es nicht ausgerichtet.
InformationsquelleAutor Adam Mihalcin
Streng, die
char
immer belegt ein byte, aber es kann sein, gefolgt von 0 oder mehr bytes Polsterung. Wie viel Polsterung, hängt von der compiler und die CPU, und auf die Ausrichtung der Typ nach derchar
in eine Struktur, und jede Verpackung pragmas, die in Kraft sind. Wenn ein N-byte-Typ muss es sich um N-byte-ausgerichtet, als auf SPARC, zum Beispiel, dann:Den einsamen
char
ist, gefolgt von 7, 3, 1 und 0 bytes in den Strukturen, die oben auf einer SPARC-Maschine und auch auf einer x86_64-Maschine.InformationsquelleAutor Jonathan Leffler
Einen "char" in C in der Regel dauert genau 8 bits (ein byte).
Jedoch ein char in ein struct ist "ausgerichtet" auf ein word, dword oder sogar quadword-Grenze:
http://en.wikipedia.org/wiki/Data_structure_alignment
Gibt es compiler-Direktiven zur Verfügung zu zwingen, die Angleichung an 4, 2 oder 1 byte (das umgeht dieses Verhalten).
Beispielsweise in Visual C++ können Sie sagen, dass "#pragma pack(1)".
InformationsquelleAutor paulsm4