2012-03-10 17 views
7

Mi chiedevo il motivo per cui questo size_t viene utilizzato dove posso dire say int type. Si dice che size_t sia un tipo di ritorno dell'operatore sizeof. Cosa significa? come se io usassi sizeof(int) e memorizzassi il suo ritorno su una variabile di tipo int, quindi funziona anche, non è necessario memorizzarlo in una variabile di tipo size_t. Voglio solo sapere chiaramente il concetto di base di utilizzare size_t con example.Thanks chiaramente comprensibiliqualcuno può spiegare perché il tipo size_t viene utilizzato con un esempio?

+0

È possibile utilizzare un int per memorizzare il ritorno di sizeof nello stesso modo in cui a volte è possibile memorizzare 2147483647 in un file int. Accade solo che le dimensioni specifiche dell'implementazione corrispondano correttamente. – Lalaland

+0

Vedi anche questa domanda: http://stackoverflow.com/questions/918787/whats-sizeofsize-t-on-32-bit-vs-the-various-64-bit-data-models – ChrisWue

+0

Qualcuno può confermare che size_t è la stessa dimensione dei registri del processore? – arthurprs

risposta

9

size_t è garantito per essere in grado di rappresentare la dimensione più grande possibile, int non è. Ciò significa che size_t è più portatile.

Ad esempio, cosa succede se int è in grado di memorizzare solo fino a 255 ma è possibile allocare array di 5000 byte? Chiaramente questo non avrebbe funzionato, tuttavia con lo size_t lo farà.

+1

Tecnicamente 'int' deve avere almeno 16 bit, come deve estendersi almeno all'intervallo [-32767..32767]. (Perché no -32768? Per sistemare i sistemi complemento e sign-and-magnitude, nel caso qualcuno voglia usare C su una vecchia macchina Univac. Ovviamente quelli hanno numeri interi a 18 e 36 bit, con 9 bit ' char'.) – torek

+0

@torek Per qualche motivo ho l'impressione che int sia solo richiesto di essere> 16 in C, non in C++. Non ho comunque controllato lo standard. – Pubby

+0

@Pubby: C++ eredita quello da C. 1.1 p2 C++ è un linguaggio di programmazione generico basato sul linguaggio di programmazione C come descritto in ISO/IEC 9899: 1999 Linguaggi di programmazione

4

L'esempio più semplice è piuttosto datato: su un vecchio sistema a 16 bit-int con 64 k di RAM, il valore di un int può essere ovunque da -32768 a +32767, ma dopo:

char buf[40960]; 

il buffer buf occupa 40 kbyte, quindi sizeof buf è troppo grande per rientrare in uno int e ha bisogno di un unsigned int.

La stessa cosa può accadere oggi se si utilizza 32 bit int ma permette ai programmi di accedere a più di 4 GB di RAM alla volta, come è il caso in quelli che vengono chiamati modelli "I32LP64" (32 bit int, 64 -bit long e puntatore). Qui il tipo size_t avrà lo stesso intervallo di unsigned long.

0

E 'definita l'implementazione ma su sistemi a 64 bit troverete che size_t è spesso a 64 bit mentre int è ancora a 32 bit (a meno che non sia il modello ILP64 or SILP64).

1

si utilizza size_t per lo più per la fusione puntatori in interi senza segno dello stesso dimensione, per eseguire calcoli sui puntatori come se fossero numeri interi, che altrimenti verrebbero impediti al momento della compilazione. Tale codice è pensato per compilare e compilare correttamente nel contesto di diverse dimensioni del puntatore, ad es. Modello a 32 bit contro 64 bit.

Problemi correlati