__sam__ a écrit : ↑15 avr. 2019 15:15
La vache, la gestion des "static" en c++ est étonnement complexe par rapport à ce que c'est sémantiquement au niveau asm (une simple zone mémoire globale mais avec un label privé connu seul de la fonction).
Après réflexion, si le static est POD (genre char, int, long) avec ou sans valeur initiale, ça ne devrait pas poser de problème pour le compilateur de mettre direct en mémoire cette valeur et de ne pas utiliser ce booléen implicite. Je vais tester ça sur Godbolt.org.
EDIT: ça passe pour les POD - pas de code implicite.
EDIT2:
Objet POD (sans constructeur) :
Code : Tout sélectionner
struct Object
{
double x, y;
//Object() : x(1.), y(1.) {}
};
void loop()
{
static Object octet = { 1., 1. };
octet = *((Object*)(0x8000));
}
donne bien le code souhaité :
Code : Tout sélectionner
loop():
push rbp
mov rbp, rsp
mov eax, 32768
mov rdx, QWORD PTR [rax+8]
mov rax, QWORD PTR [rax]
mov QWORD PTR loop()::octet[rip], rax
mov QWORD PTR loop()::octet[rip+8], rdx
nop
pop rbp
ret
Mais un objet non POD (avec un constructeur) :
donne un code qui gère un booléen *ET* un mutex pour être "multi-thread safe" :
Code : Tout sélectionner
Object::Object() [base object constructor]:
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
mov rax, QWORD PTR [rbp-8]
movsd xmm0, QWORD PTR .LC0[rip]
movsd QWORD PTR [rax], xmm0
mov rax, QWORD PTR [rbp-8]
movsd xmm0, QWORD PTR .LC0[rip]
movsd QWORD PTR [rax+8], xmm0
nop
pop rbp
ret
loop():
push rbp
mov rbp, rsp
movzx eax, BYTE PTR guard variable for loop()::octet[rip]
test al, al
sete al
test al, al
je .L5
mov edi, OFFSET FLAT:guard variable for loop()::octet
call __cxa_guard_acquire
test eax, eax
setne al
test al, al
je .L5
mov edi, OFFSET FLAT:loop()::octet
call Object::Object() [complete object constructor]
mov edi, OFFSET FLAT:guard variable for loop()::octet
call __cxa_guard_release
.L5:
mov eax, 32768
mov rdx, QWORD PTR [rax+8]
mov rax, QWORD PTR [rax]
mov QWORD PTR loop()::octet[rip], rax
mov QWORD PTR loop()::octet[rip+8], rdx
nop
pop rbp
ret
.LC0:
.long 0
.long 1072693248
Pas la même longueur hein !