Beim Anlegen von Speicher hat der Compiler ein Alignment i.d.R. 4 Bytes nach den er alles ausrichtet. Das stimmt aber nicht ganz, da es auch drauf ankommt in welcher Reichenfolge du Speicher reservierst:
Kuck dir folgende drei Beispiele an und überleg dir wie groß der reservierte Speicher sein wird. Tip: int = 4 Bytes, short = 2 Bytes und char = 1 Byte.
Beispiel 1:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include<iostream>
class CEntity
{
public:
CEntity() { }
public:
char m_cValue3;
int m_iValue1;
short m_sValue2;
};
int main()
{
CEntity en;
unsigned int size = sizeof( en );
std::cout << size << std::endl;
std::cin.get();
return 0;
}
|
Beispiel 2:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include<iostream>
class CEntity
{
public:
CEntity() { }
public:
int m_iValue1;
short m_sValue2;
char m_cValue3;
};
int main()
{
CEntity en;
unsigned int size = sizeof( en );
std::cout << size << std::endl;
std::cin.get();
return 0;
}
|
Beispiel 3:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#include<iostream>
#pragma pack(1)
class CEntity
{
public:
CEntity() { }
public:
char m_cValue3;
int m_iValue1;
short m_sValue2;
};
int main()
{
CEntity en;
unsigned int size = sizeof( en );
std::cout << size << std::endl;
std::cin.get();
return 0;
}
|
Du denkst wahrscheinlich, dass es immer 7 Byte sind!?
Ergebnis:
Beispiel 1: 12 Byte
Beispiel 2: 8 Byte
Beispiel 3: 7 Byte
Der Compiler kann in verschiedenen Grenzen ausrichten. Im ersten Fall muss er char nach int ausrichten und short muss ebenfalls ausgerichtet werden, da char ausgerichtet wurde. Das heißt int bestimmt das Alignment mit 4 Bytes, Ergebnis: 12 Bytes!
Beim zweiten Fall steht der Größte Wert als erstes in der Liste der Member, da sieben Byte aber nicht in die Alignment Grenze fallen, wird ein Speicher von 8 Byte reserviert.
Beim dritten Beispiel schaltest man mit #pragma pack(1) das Alignment ab und alles wird mit seinem originalen Wert reserviert, daher 7 Bytes.
Abschalten von Alignment ist keine gute Idee, wenn du für verschiedene Platformen entwickeln willst. Daher solltest du einfach deine Member immer nach Größe sortieren und so möglichsten wenig Speicher beanspruchen.
So ich hoffe ich habe überhaupt dein Problem erkannt und hoffe der kleine Ausflug in die Welt des Memory Alignment hat dir weiter geholfen.