`short int` vs `int`

Dovrei utilizzando short int invece di int? C’è qualche differenza utile? Eventuali insidie?

  • Ho aggiunto una domanda alla tua domanda.
InformationsquelleAutor | 2010-12-14



5 Replies
  1. 8

    Quello che ha detto Ben. Sarà effettivamente creare meno efficiente del codice, in quanto tutti i registri necessario rimuovere il bit superiori di ogni confronti sono fatti. A meno che non è necessario per salvare la memoria, perché si dispone di tonnellate di loro, utilizzare l’intero nativo dimensioni. Che è quello che int è per.

    EDIT: non vedere anche il vostro sub-domanda su const. Utilizzando const su tipi intrinseci (int, float) è inutile, ma tutti i puntatori/riferimenti devono assolutamente essere const in quanto applicabili. Stesso per la classe di metodi.

    • Ha un senso. Grazie!
    • Per “intrinseca” i tipi, const può fare la differenza a seconda del contesto: un membro statico costante o costante di tipo integrale sarà compilare costanti di tempo e, come tale, può essere utilizzato in luoghi in cui le variabili non possono, come per esempio il numero di elementi in un array. Si noti, tuttavia, che non tutte le costanti possono essere considerati come compilare costanti di tempo, ma che in ogni caso il compilatore potrebbe essere in grado di utilizzare le informazioni supplementari durante l’ottimizzazione.
    • La maggior parte dei compilatori non considerare un const int una compilazione-costante di tempo – dopo tutto, a meno che la funzione inline (o la chiamata di funzione accade la stessa cosa .file cpp), il compilatore non è possibile conoscere il valore. Ma anche se È inline, compilatori generalmente non riconoscere un const int argomento come espressione costante e gettare un errore di compilazione.
    • -1 “Uso di const su tipi intrinseci (int, float) è inutile“” non è corretto e molto fuorviante, in quanto la pretesa fatto, e assurdamente sbagliato come consigli.
    • Sono d’accordo, con Applausi. Dal const è destinato a dare il supporto del compilatore il significato semantico di una variabile che non dovrebbe cambiare, const deve essere utilizzato su un primitivo/tipo intrinseco in ogni caso, che sarebbe utilizzato altrove. Fare altrimenti sarebbe come scegliere se utilizzare una ciotola o piatto a seconda se è stato ordinato o cucinati in casa (un’implementazione, infatti, simile a puntatore vs copia) al posto di quello per il cibo, e buona fortuna a mangiare la minestra!
    • Penso che se si sta andando ad essere la promozione nativa dimensione dei registri, si potrebbe anche andare tutto il senso e l’uso a lungo in questi giorni. L’assemblea è probabilmente andando a essere lo stesso, e a lungo ha una probabilità di essere in grado di codificare i puntatori a 64 bit, a differenza di int. Forse mi sbaglio, ma penso che a lungo è il nuovo int (almeno per quanto riguarda la funzione di ritorno di tipi e parametri sono interessato).

  2. 15

    breve vs int

    Non perdete tempo con short a meno che non c’è una ragione molto buona come il risparmio di memoria su una marea di valori, o in conformità di un particolare layout di memoria richiesti da altri codice.

    L’utilizzo di un sacco di diversi tipi integer solo introduce complessità e possibile avvolgente bug.

    Sui computer moderni si potrebbe anche introdurre inutile inefficienza.

    const

    Cospargere const liberamente ovunque.

    const vincola cosa potrebbe cambiare, rendendo più facile per capire il codice: sai che questa bestiolina non è gonna move, quindi, può essere ignorato, e il pensiero diretto a più utili/rilevanti le cose.

    Di livello superiore const per argomenti formali è tuttavia, per convenzione, omesso, forse perché il guadagno non è sufficiente per giustificano l’aggiunta di verbosità.

    Anche, in una pura dichiarazione di una funzione di primo livello const per un argomento viene semplicemente ignorato dal compilatore. Ma, d’altra parte, alcuni altri strumenti potrebbe non essere abbastanza intelligente per ignorarli, quando si confrontano puro dichiarazioni di definizioni, e una persona che ha citato che in un precedente dibattito sulla questione, la comp.lang.c++ gruppo Usenet. Quindi dipende in qualche misura la toolchain, ma per fortuna, io non ho mai usato strumenti che posto qualche significato su quelle consts.

    Cheers & hth.,

    • Da “top-level const” intendi questo, giusto? funzione( const int topLevelArgument );
    • sì.]]]]]]]]]]]]]]]]]]
    • Va bene, grazie.
    • Di livello superiore const è solo ignorato dal compilatore nella dichiarazione, ma non nella definizione: void foo(int); e void foo( const int ); sono equivalenti in avanti dichiarazioni. L’attuale definizione di funzione, il cost avrà il compilatore si lamentano se si tenta di modificare il valore: void foo( const int x ) { ++x; } è un errore del compilatore, mentre void foo( int x ) { ++x; } è bene. Nota che void foo(int); in un dichiarazione di una di esse (come void foo( const int );
    • interessante commento. cosa mi scrive che si è sentito è stato di poco chiaro?
    • Non mi sentivo che era abbastanza chiaro che il const non saranno ignorati nella definizione della funzione, è chiaro che nella dichiarazione viene ignorato.
    • si prega di indicare il motivo per il downvote, in modo che gli altri possono vedere cosa c’è di sbagliato con la risposta, o perché il downvote è sciocco.
    • Cosa succede su Cpu a 64 bit quando i compilatori usano ancora int come un numero a 32 bit? Non sarebbe più opportuno utilizzare la CPU nativa dimensione, invece? È comune al giorno d’oggi che questa espressione è vera: sizeof(int) != sizeof(int*)
    • Il 64-bit il modello con 32-bit int) è utilizzato in Windows. Io non sono a conoscenza di eventuali problemi con esso (come un ex programmatore di Windows facendo ancora qualche hobby roba). Può avere alcuni vantaggi, per esempio, che un array di 32-bit int, potrebbe rientrare in una cache, mentre un corrispondente matrice di 64-bit int non.
    • Io non sono sicuro circa la prima parte. Ho appena testato che sizeof espressione in gcc 6.3 e ho avuto 4 != 8
    • Supponendo che 4 != 8 significa che int è di dimensione 4 e void* è di dimensione 8, che è quello che si ottiene con un sistema a 32-bit int a 64 bit di programmazione. Il int è a 32 bit. Il puntatore, void*, è a 64 bit. Così, non capisco cosa vuoi dire con “io non sono sicuro circa la prima parte”. Che cosa vuoi dire?
    • hai detto che il modello utilizzato in Windows. Così sono andato a controllare cosa succede in Linux, ho ottenuto lo stesso risultato. Sembra che int è ancora di 4 byte ovunque.
    • OK, ora è più chiaro di quello che stai chiedendo: quali sistemi 64-bit int? l’articolo di Wikipedia sull’argomento ha alcuni esempi. Non so di qualsiasi ragionevolmente elenco completo di tali sistemi, mi dispiace.

  3. 9

    Assolutamente non in funzione di argomenti. Alcune convenzioni di chiamata intenzione di fare alcuna distinzione tra breve e int. Se stai facendo gigante matrici si potrebbe utilizzare short se i dati si inserisce in short per salvare la memoria e aumentare la cache di efficacia.

  4. 1

    La domanda è tecnicamente corretto “devo usare short int?”. L’unica buona risposta sarà “non so, che cosa stai cercando di realizzare?”.

    Ma vediamo alcuni scenari:

    1. Si sapere definito intervallo di valori che la variabile può assumere.

    Gli intervalli per gli interi con segno sono:

    • signed char — -2⁷ – 2⁷-1
    • short — -21⁵ – 21⁵-1
    • int — -21⁵ – 21⁵-1
    • long — -231 – 231-1
    • long long — -2⁶3 – 2⁶3-1

    Si noti che queste sono le fasce garantite, possono essere anche più nel particolare, l’attuazione, e spesso lo sono. Si sono garantiti anche che la serie precedente non può essere superiore al prossimo, ma possono essere uguali.

    Sarà presto nota che short e int in realtà hanno le stesse garanzie di gamma. Questo ti dà molto poco incentivo a utilizzare. L’unica ragione per usare short di fronte a questa situazione diventa di dare altri codificatori un suggerimento che i valori non troppo grande, ma questo può essere fatto tramite un commento.

    Vi è, tuttavia, un senso utilizzare signed char, se si sa che si può montare ogni valore potenziale nell’intervallo -128 e 127.

    1. Non si conosce l’esatto intervallo di valori possibili.

    In questo caso si è in una situazione piuttosto brutta posizione per tentare di ridurre al minimo la memoria useage, e probabilmente dovrebbe utilizzare almeno int. Anche se ha lo stesso intervallo minimo come short, su molte piattaforme non possono essere più grandi, e questo vi aiuterà.

    Ma il problema più grande è che si sta tentando di scrivere un pezzo di software che gestisce i valori, la gamma dei quali non si conosce. Forse qualcosa di sbagliato è successo prima di aver iniziato a scrivere codice (quando i requisiti sono stati scritti fino).

    1. Hai un’idea di gamma, ma rendersi conto che si può cambiare in futuro.

    Chiedetevi come vicino al limite sei tu. Se stiamo parlando di qualcosa che va da -1000 a +1000 e potenzialmente in grado di modificare a -1500 – 1500, quindi con tutti i mezzi utilizzare short. L’architettura può pad del vostro valore, il che significa che non faccia risparmiare spazio, ma non si perde nulla. Tuttavia, se abbiamo a che fare con una quantità che è attualmente -14000 – 14000, e può crescere in modo imprevedibile (forse qualche valore finanziario), quindi non basta passare a int, andare a long subito. Si perde un po ‘ di memoria, ma si salva te stesso un sacco di mal di testa la cattura di questi roll-over bug.

    • Guarda la cronologia delle revisioni della questione, c’era una domanda su const che è stato rimosso
  5. 0

    breve vs int – Se i dati si adatta in breve, l’uso a breve. Salvare la memoria. Rendere più facile per il lettore a conoscere la quantità di dati che la variabile può montare.

    uso di const – Grande pratica di programmazione. Se i dati devono essere const poi si fanno const. È molto utile quando qualcuno legge il codice.

    • “Salvare la memoria” – non proprio. Che cosa si salva in memoria si finirà per pagare in extra codice, e poi alcuni! A meno che non si tratta di un array, non farlo. Inoltre, se il tuo corto è incorporato in ints, la struttura imbottitura per ridurre il risparmio di memoria a zero.
    • Si tratta di un buon punto di dare un suggerimento ad altri programmatori.

Lascia un commento