Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
O smecherie pe care nu o inteleg

Balcon parter fara acte

unde gasesc un speed bag in bucur...

Programe TV cu altfel de sporturi
 Laptop "bun la toate" max...

navigatie noua vw tiguan

ctfmon.exe - System Error (in Saf...

Ați prins vremurile cand 120 Volț...
 Whatsapp nu afișeaza numele ...

Medii admitere Politehnica Bucure...

Se extinde Baza de la Kogalniceanu

Politist mutilat de caine in curt...
 Trotineta- cat rezista?

Windows 11 si inregistrare de pe ...

Cont Facebook spart

Accesare Plex prin webstation
 

Initializare facila mai multe variabile

- - - - -
  • Please log in to reply
9 replies to this topic

#1
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
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
Argv

Argv

    Senior Member

  • Grup: Senior Members
  • Posts: 2,463
  • Înscris: 25.10.2007
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.


#3
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007
https://stackoverflo...ialization-in-c

#4
darkangel2

darkangel2

    Senior Member

  • Grup: Senior Members
  • Posts: 3,294
  • Înscris: 26.01.2019

 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 :D ).

Cand ai de ales intre KISS si "ceva smecher dar fara o utilitate evidenta", alege principiul KISS. :)

#5
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006

 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.


#6
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007
https://godbolt.org/z/h8Wv1Wd6x

#7
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,183
  • Înscris: 24.02.2007
https://godbolt.org/z/TY7c4za15

https://en.cpprefere..._initialization

Edited by dani.user, 21 March 2023 - 00:28.


#8
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
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
GabyF

GabyF

    Junior Member

  • Grup: Members
  • Posts: 231
  • Înscris: 27.09.2006
Ok, se pare ca asa merge:

class A {
Vars my_vars;
A() : t2()  {
}
TestIniStruct t2;
};



#10
darkangel2

darkangel2

    Senior Member

  • Grup: Senior Members
  • Posts: 3,294
  • Înscris: 26.01.2019

View PostGabyF, 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};


View PostGabyF, on 20 martie 2023 - 22:56, said:

Nu inteleg ce face acel bool...

Oricum codul din primul post nu prea face nimic... :D

View PostGabyF, 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

Neurochirurgie minim invazivă 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

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate