notes Arthur sur C++

Mémoire et allocation

Scope

Portée Allocation Durée de vie Visibility
Life int a; Data segment Program All
static int a; Data segment Program Fichier
new int a; Heap Manual Fichier via ptr
extern int a;
Local { int a; } Stack Bloc Bloc
{ static int a; } Data segment Program Bloc
{ new int a; } Heap Manuel Bloc via ptr
{ extern int a; }

Iterators

index 0 1 2 3 4
vector 'M' 'i' 'n' 'e' 't'
value v.front() v.back()
iterator v.begin() v.end()
iterator v.rend() v.rbegin()

Types

16
0000
uint8_t char 0x41 256
0100 0001
uint16_t short 0x0000 65'536
0000 0000 . 0000 0000
uint32_t int 4 mrd
1100 0000 . 1010 1000 . 0000 0000 . 0000 0001
uint64_t long long
0000000000000000000000000000000000000000000000000000000000000000
sign exponent mantissa
float 1 8 23 - 0 1000000 0 1001001 00001111 11011011 \[ \gray{±}10^{\gray{±}38} \]
double 1 11 52 - 0 1000000 0000 1001 00100001 11111011 01010100 01000100 00101101 00011000 \[ \gray{±}10^{\gray{±}308} \]

Integer to Real lossless conversion

type \[ 2^{mantissa + 1} \] char short int long long
float \[ 2^{23 + 1} \] 16'777'216
double \[ 9^{52 + 1} \] \[ \sim 9^{15} \]



Exemple de structure de mémoire

a = 0x1234, short, 2 bytes
b = 0x11223344, int, 4 bytes
c = 0x56, char, 1 byte
adresses en 8 bytes

Adresse Valeur du byte Variable
0x1af47ffee4933868 0x12 a(1)
0x1af47ffee4933869 0x34 a(2)
0x1af47ffee493386a 0x11 b(1)
0x1af47ffee493386b 0x22 b(2)
0x1af47ffee493386c 0x33 b(3)
0x1af47ffee493386d 0x44 b(4)
0x1af47ffee493386e 0x56 c


Références et pointeurs

item sigle associé possibilité exemple
Adresse & Accès en lecture
via &a ou p
0x1af47ffee4933868
Valeur * Accès en lecture
et/ou écriture
via a ou *p
0110 1000 0010 1010
temps instruction 0x12 0x13 0x14 0x15 0x15
t1 int a = 10; 10 - - - -
t2 int* p = &a; 10 0x12 - - -
t3 *p = 7; 7 0x12 - - -
t4 int b = 12; 7 0x12 12 - -
t5 a = 99; 99 0x12 12 - -

Exemple de l'évolution de l'état d'un système 2


temps instruction 0x12 0x13 0x14 0x15 0x16
t1 int a = 10; (a) 10 - - - -
t2 int* p = &a; (a) 10 (*p) 0x12 - - -
t3 *p = 7; (a) 7 (*p) 0x12 - - -
t4 int b = 12; (a) 7 (*p) 0x12 (b) 12 - -
t5 a = 99; (a) 99 (*p) 0x12 (b) 12 - -
t6 const int c = 5; (a) 99 (*p) 0x12 (b) 12 ■ (c) 5 -
t7 int* const q = &b; (a) 99 (*p) 0x12 (b) 12 ■ (q) 0x14 ■ (c) 5
t8 *q = 15; (a) 99 (*p) 0x12 (b) 15 ■ (q) 0x14 ■ (c) 5
t9 int& r = a; (a r) 99 (*p) 0x12 (b) 15 ■ (q) 0x14 ■ (c) 5
t10 r = 20; (a r) 20 (*p) 0x12 (b) 15 ■ (q) 0x14 ■ (c) 5
Note et ont exactement le même comportement
int a = 1;
int& b = a;
Un grand bateau le sens est le même
int b = 1;
int& a = b;
Un bateau grand le sens est le même

Pointeurs

a *p explication
const int a; const int* const p = &a; Rien ne peut changer
_____ int a; const int* const p = &a; La variable peut être modifiée mais pas via le pointeur
const int a; const int* _____ p = &a; Le pointeur peut être redirigé mais ne peut pas modifier la valeur de l’entier constant
_____ int a; const int* _____ p = &a; Le pointeur peut être redirigé et ne peut pas modifier pas la valeur de l’entier qui peut être modifiée ailleurs.
const int a; _____ int* const p = &a; Un pointeur vers un entier non constant ne peut pas pointer vers une constante.
_____ int a; _____ int* const p = &a; Un pointeur constant vers un entier modifiable ne peut pas être redirigé mais peut modifier la valeur pointée.
const int a; _____ int* _____ p = &a; Un pointeur modifiable vers un entier non constant ne peut pas pointer vers une constante.
_____ int a; _____ int* _____ p = &a; Tout est modifiable.
Pointeur constant : c'est le pointeur qui est constant