Violate.
A violate specifer is a hint to the compiler that an object may change its value in ways not specified by the language so that aggressive optimalisations must be avoided. For example a real time clock might be declared
extern const voilate clock;
Als ik zie hoe goed je het kunt spellen heb je het
VOLATILE keyword nog nooit gebruikt
En nog wat toelichting:
-
auto is overbodig daar het de defaultstijl voor een variabeledeclaratie is.
-
mutable variabelen hebben een impliciete const_cast. Als je een const-memberfunctie hebt in een class mag deze geen membervariabelen wijzigen BEHALVE de mutables. Errug zeldzaam

-
register gebruik je in parameterlijsten of lokale variabelen om ervoor te zorgen dat ze niet in het geheugen belanden maar in een CPU-register blijven indien mogelijk. In principe overbodig door moderne optimizers inderdaad.
-
volatile variabelen gebruik je in principe alleen in multithreaded programmas. Het zorgt ervoor dat iedere read/write op die variabele pas op het exacte moment van uitvoeren gedaan wordt: dus geen forward optimalizations of vooruitlopende conclusies in conditionals.
Met
volatile kun je bijvoorbeeld een simpel type critical section of semaphore maken (overigens geen vervanger voor dat kernelmode object daar die een stuk effectiever is en beter beschermd, maar leuk ter illustratie):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| class MyCriticalSection
{
public:
MyCriticalSection(bool p_Initial = false)
{
m_Locked = p_Initial;
}
void Lock()
{
while(m_Locked)
Sleep(0);
m_Locked = true;
}
void Unlock()
{
m_Locked = false;
}
private:
volatile bool m_Locked;
}; |
En als laatste de
union, waarvoor we even een klassieke
Variant uit de kast trekken:
code:
1
2
3
4
5
6
7
| type union
{
char m_Byte;
short m_Short;
long m_Long;
__int64 m_Big;
} t_Variant; |
Als jij nu een variabele van het type t_Variant declareert zal deze sizeof(__int64) bytes groot zijn (8 dus). Dit komt omdat binnen een union alle members op dezelfde plaats in het geheugen liggen, en de grootte van een union dus gelijk is aan die van zijn grootste member. Dit staat je toe zoals in dit voorbeeld een variabele te declareren die verschillende types data kan opslaan afhankelijk van wat je op dat moment nodig hebt. Nog een mooi voorbeeld uit Windows:
code:
1
2
3
4
5
6
7
| typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER, *PLARGE_INTEGER; |
Dit is een 64-bits waarde die je zowel als 64-bits waarde (quadpart) of als 2 32-bits waardes aan kunt spreken. Wijzigen van de 1 wijzigt de ander.