2016-01-01 32 views
7

Sono un ingegnere elettrotecnico rivolto allo scienziato informatico. È davvero difficile per me capire perché in C++ ci sono così tante cose che sono quasi uguali ma non completamente uguali. Un esempio è short vs int vs unsigned int vs size_t vs long int vs long long int vs uint8_t (non so se c'è un modo aggiuntivo per designare un numero intero). Sembra che rende la lingua inutilmente complicata.Perché size_t esiste in C/C++ e potrebbe/dovrebbe essere sostituito?

Potrebbe o dovrebbe size_t essere sostituito o ha qualche funzione impossibile da usare in un altro modo?


[EDIT]

Dopo le risposte utili, c'è qualcosa che io ancora non pienamente vedo. size_t è utile in termini di portabilità e prestazioni come suggerito da più persone. Ma quanto è utile, c'è un modo quantitativo o prove numeriche per misurare i vantaggi rispetto al solo int e andare in pensione tutti i suoi fratelli ???

+0

I tipi nativi (come 'int',' short' ecc.) Ci sono in parte perché è quello che C aveva, e C++ era in origine solo un preprocessore che generava il codice C, l'altra parte è perché rende molto più facile codificare "vicino al metallo". Il tipo di alias (come 'size_t') è quello di rendere il codice più leggibile ed è più mostrare l'intento. Usando 'size_t' dici che" questa è una dimensione ", quindi è più per i programmatori e meno per la necessità del compilatore. –

+2

Possibile duplicato di [unsigned int vs. size \ _t] (http://stackoverflow.com/questions/131803/unsigned-int-vs-size-t), o qualsiasi altra domanda size_t nella sezione "related". – Zeta

+3

Sostituito con .... cosa? –

risposta

14

std::size_t è un typedef per un tipo fondamentale unsigned, e dovrebbe essere in grado di rappresentare ogni possibile indice/formato nel programma (tecnicamente, è anche il risultato dell'operatore sizeof). Il suo tipo fondamentale sottostante può differire in diverse implementazioni, e perché si vuole la portabilità, è utilizzare std::size_t e non ci importa più se si tratta di un unsigned long int o unsigned long long int ecc

std::size_t non usufruisce di caratteristica impossibile da utilizzare in un altro modo, è solo un alias di tipo comodo e nient'altro.

In risposta alla modifica OP

@HoapHumanoid La modifica non è una domanda molto buona per StackOverflow, in quanto è una questione di interpretazione personale/preferenza. Naturalmente puoi avere un solo tipo numerico, o tipi di dimensioni fisse, tuttavia quando vuoi spremere le prestazioni dal tuo processore, è meglio avere molti, ognuno in grado di rappresentare un intervallo specifico, a seconda della piattaforma fisica . Poiché le architetture dei computer sono molto diverse, ciascuna architettura imporrà le proprie dimensioni per es. int, long ecc. Quando si combina questo problema con la portabilità, quindi size_t emerge in modo naturale. Cos'altro useresti in una funzione generica che, ad es. è la garanzia di allocare più memoria possibile su ogni possibile implementazione? Useresti int per passare il numero di byte? O forse long int? Devi leggere il manuale del compilatore, controllare il tipo appropriato ecc., Quindi usarlo. Questo è ciò che l'implementazione C++ fa per te, definisce un tipo appropriato.

+0

Ma potremmo invece usare typedef e definire qualcosa come my_wonderful_int ??? E uccidi size_t ?? Non ucciderlo povero ragazzo, ritiralo XDDD –

+1

@HoapHumanoid Sì, ma 'size_t' è definito in modo che tutti sappiano che esiste e lo usa. Altrimenti altri programmatori non sapranno del tuo * meraviglioso_int *. Un tipo garantito per avere lo stesso nome su tutte le piattaforme e garantito anche per memorizzare qualsiasi indice possibile è super utile in termini di portabilità. Ad esempio, sulla mia macchina potrei avere 'typedef unsigned long long size_t', mentre sul tuo potresti avere' typedef unsigned long size_t'. Senza questo 'typedef', dovresti conoscere la dimensione corretta su ogni piattaforma, che diventa un dolore. – vsoftco

+0

OK, e se uccidiamo (ritiriamo hehe) non solo size_t ma anche tutti i cugini e usiamo solo int ?. Forse dovrei chiedere questo in un'altra domanda. Lo farò –

2

Hai dimenticato long long int, la maggior parte delle versioni senza firma, uint8_t e gli amici, e probabilmente un po 'di più. :-)

In alcune lingue la dimensione dei tipi interi è fissa. Il C++ non è uno di quelli; al programmatore viene data molta flessibilità per consentire il bilanciamento delle prestazioni in base alle dimensioni e alla portata.

Ma size_t è estremamente utile.È garantito che sia in grado di contenere la dimensione di qualsiasi oggetto o qualsiasi indice di array valido. Non averlo potrebbe rendere molto più difficile scrivere programmi portatili ma efficienti.

+0

Sapevo che c'erano più modi per esprimere int hehehe. Per quanto riguarda ciò che hai detto per contenere la dimensione di qualsiasi oggetto. Non possiamo farlo con nessuno degli altri 9 tipi di numero intero ?? –

+2

Bene, 'non firmato. int' potrebbe essere troppo piccolo su un sistema a 64 bit, e 'unsigned long long 'sarebbe troppo grande su un sistema a 32 bit. Quindi su un dato sistema almeno uno degli altri tipi funzionerebbe, ma esattamente quale si potrebbe variare su sistemi diversi. –