Cum se calculează valoarea sizeof (struct) în C


Cel mai bun răspuns

Secvența exactă sizeof(struct) este o eroare de compilare în C. Presupun că întrebați cum determinați dimensiunea unui particular struct.

Acest răspuns nu este furnizat direct de definiția limbajului C. Mai degrabă, este o funcție a ABI pentru arhitectura țintă specială. (ABI înseamnă Application Binary Interface.)

Standardul de limbaj C stabilește câteva reguli generale. De exemplu, dacă aveți un struct cu mai mulți membri, primul membru va partaja o adresă cu struct însuși, iar membrii următori vor să fie la adrese mai mari.

Câmpurile de biți au propriul lor set de reguli. Nu le voi recapitula aici.

Pentru o primă comandă, dimensiunea unui struct va fi cel puțin la fel de mare ca suma mărimii membrilor săi (ignorând momentan câmpurile de biți). Membrii pot avea constrângeri de aliniere și, dacă au, mediul poate introduce padding între membri și padding la sfârșitul struct.

Luați în considerare următoarele struct pe o arhitectură care necesită alinierea de 8 octeți pentru valorile double:

struct fun {

char a;

double b;

char c;

};

Conform regulilor limbajului C, b trebuie să fie la o adresă mai mare decât a în orice caz de struct fun. De asemenea, c trebuie să fie la o adresă mai mare decât b.

Ca urmare, această structură specială ocupă probabil 24 octeți, datorită constrângerilor de aliniere de pe b pe acea arhitectură. Aceeași structură ar putea necesita doar 16 octeți pe o arhitectură care necesită doar alinierea a 4 octeți pentru double.

Nu mă credeți?

Vedeți singur:

În cele din urmă, trebuie să consultați ABI-ul platformei dvs. țintă pentru a înțelege modul în care un struct se împachetează împreună pentru care țintă.

Sau, pur și simplu utilizați sizeof dacă personal nu vă pasă, dar codul dvs. trebuie să aibă grijă.

Răspundeți

Cum calculez valoarea sizeof (struct) în C?

Nu. Compilatorul o face.

În primul rând, sizeof(struct) este o eroare de sintaxă. Probabil că vă întrebați cum să determinați dimensiunea unui tip de structură sau a unui obiect de un astfel de tip. Este important să fii precis. (Înțeleg că eliminarea de către Quora a detaliilor întrebărilor face acest lucru dificil.)

Să presupunem că aveți un tip de structură numit struct foo și / sau un obiect de acel tip numit obj. Dimensiunea tipului este sizeof (struct foo), iar dimensiunea obiectului (care este aceeași cu dimensiunea tipului său) este sizeof foo . (Parantezele sunt necesare în primul caz și nu în al doilea. Există de fapt două forme diferite ale operatorului sizeof. Una este aplicată unui nume de tip parantezat, cealaltă unui expresie, care este adesea, dar nu întotdeauna un nume de obiect.)

S-ar putea să vă gândiți că puteți calcula dimensiunea unei structuri adăugând dimensiunile membrilor săi. Nu poți. Compilatoarele pot și pot introduce căptușeala între membri și, eventual, după ultimul membru, pentru a satisface cerințele de aliniere. Dimensiunea unei structuri este cel puțin suma dimensiunilor membrilor săi, dar dacă aveți nevoie de dimensiunea întregii structuri, utilizați doar sizeof. Pentru asta este.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *