Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.04.2009, 15:58

sizeof(...) Problem

Hi,

ich hab eine kleine Frage wegen sizeof.

habe eine Struktur definiert:

struct FileHeader
{
WORD bfType;
DWORD bfSize;
DWORD bfReserved;
DWORD bfOffBits;
};

1 Word = 2 Byte
1 DWORD = 4 Byte

2 + (4*3) = 14

Das gleiche sagt auch cout.

Wenn ich jetzt aber sizeof(FileHeader) benutze, gibt sizeof eine Größe von 16 Byte aus.

Hab ich irgendwas übersehen? o0
Bei 4x Int z.B. stimmen 16 Byte.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

22.04.2009, 16:15

Der Compiler fügt zwei padding Bytes ein.

3

22.04.2009, 16:16

Zitat

Das gleiche sagt auch cout.

Haeh?

Naja, das ganze nennt sich Padding.
If it were not for laughter, there would be no Tao.

4

22.04.2009, 16:34

Vielen Dank für die schnelle Hilfe!

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

23.04.2009, 09:08

Um die Größe deiner Struktur auf 14 Byte "zu zwingen", könntest du folgendes tun:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
#pragma pack( push, 1 ) // oder 2 in deinem Fall

struct FileHeader
{
    WORD bfType;
    DWORD bfSize;
    DWORD bfReserved;
    DWORD bfOffBits;
};
#pragma pack( pop )

Ich habs jetzt nur ausm Kopf heraus geschrieben, sollte aber funzen. Mit #pragma pack wird das Speicher-Alignment manipuliert. Bei 32-Bit-Systemen ist es standardmäßig auf 4 Byte eingestellt. In meinem Beispiel wird das Alignment temporär auf 1 Byte gesetzt. Für deinen Fall wäre es aber auch möglich, es auf 2 Byte zu stellen...
Kommen Sie nie mit einem Schwert zu einer Schießerei.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

23.04.2009, 10:12

Stimmt alles was gesagt wurde, nur zur Sicherheit sei noch gesagt:

Es hat schon seine Gründe warum der Compiler padding macht (weil die Zugriffe auf einzelne Member dann viel schneller gehen) und deswegen würd ich da jetzt auf keinen Fall versuchen der vermeintlichen Speicherverschwendung mit #pragma pack Einhalt zu gebieten ;)

#pragma pack mag in exotischen Situationen sinnvoll sein wenn ich genau weis was ich tue, ist aber sicher nichts was man bei jedem struct einfach mal so drumherumpackt...

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

7

23.04.2009, 15:41

Als sinnvollen Anwendungsfall für "selbstebestimmtes" Padding würden mir spontan Netzwerkdaten einfallen. Da können diese paar Byte schon einiges ausmachen.

Aber abgesehen davon fällt mir dann auch nix ein.

n0_0ne

1x Contest-Sieger

  • Private Nachricht senden

8

23.04.2009, 16:20

Naja, man muss bedenken, dass der Speicher im Gegensatz zum Prozessor extrem langsam ist. Wenn man es durch padding schafft, einen zusätzlichen Speicherzugriff, weil die Daten beispielsweise auf 4 Byte, statt auf 6 oder so zusammengeschrumpft sind, einzusparen, wäre es wirklich sinnvoll. Zusätzliche shift-operationen o.ä. die vielleicht nötig werden, kann man dann im Gegensatz zum Speicherzugriff fast vergessen. Ein Programm würde nicht nur weniger Platz brauchen, sondern auch schneller laufen.
Das Problem ist aber wohl, dass man kaum weiß, was genau der Compiler macht...

Werbeanzeige