Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
Initializare facila mai multe variabile
Last Updated: Mar 22 2023 20:56, Started by
GabyF
, Mar 20 2023 17:33
·
0
#1
Posted 20 March 2023 - 17:33
Cat de sigura este initializarea tuturor variabilelor dintr-o structura cu memset?
struct Vars { int x, arr_x[22]; double z, arr_z[7][33]; float y, arr_y[44]; bool q; }; class A { Vars my_vars; A() { memset(&my_vars,0,sizeof(Vars)); } }; Structura nu va contine char* sau string. Exista vreo garantie ca memoria este ocupata in ordine de catre variabilele din structura? Am gasit cazuri cand la un array multidimensional alocat cu new, erau alocate zone de memorie pe sarite. |
#2
Posted 20 March 2023 - 19:58
Memoria este ocupata in ordine doar ca, in functie de parametrii compilatorului, este posibil sa alinieze membrii acelei structuri la anumite adrese de memorie.
Citeste despre: - C++ Data structure alignment - offsetof - pragma pack - __attribute__((__packed__)) - __attribute__ ((aligned(N))) Edited by Argv, 20 March 2023 - 19:59. |
#4
Posted 20 March 2023 - 21:52
GabyF, on 20 martie 2023 - 17:33, said:
Cat de sigura este initializarea tuturor variabilelor dintr-o structura cu memset? Foarte sigura doar daca toate de mai jos sunt adevarate: 1 E o structura "pura", fara elemente obiectuale (constructori, metode etc.) 2 Tipurile de date ale tuturor campurilor sunt simple (nu obiecte) In cazul codului tau, cel mai probabil, nu este sigur din cauza "bool q" care nu este un tip de date simplu (in general). GabyF, on 20 martie 2023 - 17:33, said:
Exista vreo garantie ca memoria este ocupata in ordine de catre variabilele din structura? Nu's sigur 100% da' votez da pentru ordine garantata. Insa poate exista "spatiu nefolosit" intre campuri ca rezultat al alinierii offset-urilor campurilor la multiplii de X (asa cum s-a mentionat deja). Altfel spus: nu este garantat ca sizeof(struct vars) este egal cu suma din sizeof(camp) pentru toate campurile. Legat strict de codul tau: oricum nu as folosi memset (chiar daca nu ar exista acel "bool"). Motiv: nu castig nimic important dar risc sa generez probleme foarte greu de detectat in viitor (ex: alt programator muta definitia acelei structuri intr-un alt fisier din diferite motive - deci se pierde legatura "vizuala" intre structura si acel memset care ramane in alt fisier; mai e doar un pas pana cand cineva modifica structura intr-un mod care nu mai este compatibil cu memset iar inspectia vizuala a codului din jurul structurii nu va declansa niciun semnal de alarma ). Cand ai de ales intre KISS si "ceva smecher dar fara o utilitate evidenta", alege principiul KISS. |
#5
Posted 20 March 2023 - 22:56
Argv, on 20 martie 2023 - 19:58, said:
Memoria este ocupata in ordine doar ca, in functie de parametrii compilatorului, este posibil sa alinieze membrii acelei structuri la anumite adrese de memorie. Citeste despre: - C++ Data structure alignment - offsetof - pragma pack - __attribute__((__packed__)) - __attribute__ ((aligned(N))) Adica? Nu e ce am zis si eu cu alte cuvinte? darkangel2, on 20 martie 2023 - 21:52, said:
In cazul codului tau, cel mai probabil, nu este sigur din cauza "bool q" care nu este un tip de date simplu (in general). Insa poate exista "spatiu nefolosit" intre campuri ca rezultat al alinierii offset-urilor campurilor la multiplii de X (asa cum s-a mentionat deja). Altfel spus: nu este garantat ca sizeof(struct vars) este egal cu suma din sizeof(camp) pentru toate campurile. Am inteles ideea, ma gandeam eu ca nu merge asa simplu... Exista vreo posibilitate totusi mai usoara decat initializare membru cu membru? Nu inteleg ce face acel bool... Cunosc adresa ultimului membru declarat, deci cu schimbarile de rigoare memset() poate ocupa toata zona de memorie. Edited by GabyF, 20 March 2023 - 22:49. |
#7
Posted 21 March 2023 - 00:26
https://godbolt.org/z/TY7c4za15
https://en.cpprefere..._initialization Edited by dani.user, 21 March 2023 - 00:28. |
#8
Posted 21 March 2023 - 09:28
Inainte de C++11 nu se putea ?
struct TestIniStruct { int a; float b; }; TestIniStruct t = {0}; // works class A { Vars my_vars; A() { } TestIniStruct t2 = {}; // error }; Edited by GabyF, 21 March 2023 - 09:30. |
#9
Posted 21 March 2023 - 10:13
Ok, se pare ca asa merge:
class A { Vars my_vars; A() : t2() { } TestIniStruct t2; }; |
#10
Posted 22 March 2023 - 20:56
GabyF, on 20 martie 2023 - 22:56, said:
Exista vreo posibilitate totusi mai usoara decat initializare membru cu membru? Cred ca aia mentionata de tine: TestIniStruct t = {0}; GabyF, on 20 martie 2023 - 22:56, said:
Nu inteleg ce face acel bool... Oricum codul din primul post nu prea face nimic... GabyF, on 20 martie 2023 - 22:56, said:
Cunosc adresa ultimului membru declarat, deci cu schimbarile de rigoare memset() poate ocupa toata zona de memorie. Scuze, cred ca nu m-am exprimat foarte clar... Cand am zis "Insa poate exista spatiu nefolosit intre campuri" am intentionat doar sa mentionez ca, desi campurile sunt alocate in memorie in ordinea mentionata in cod, ele nu sunt neaparat asezate continuu, unul dupa altul (cf. spatiului consumat de tipul de date al fiecarui camp), pot exista spatii (bytes) "nefolosite" intre campuri ("nefolosite" in sensul ca nu vor fi niciodata scrise sau citite daca citesti sau scrii continutul structurii referind fiecare camp si nu folosesti memset cu adresa destinatie egala cu adresa variabilei de tipul structurii). Operatorul sizeof aplicat unei structuri intoarce corect spatiul total alocat la runtime, spatiu care include orice spatii "nefolosite" dintre campuri => memset combinata cu sizeof va scrie toata memoria alocata structurii (inclusiv acei bytes "nefolositi"). |
|
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users