Când să folosiți `short` în loc de `int`? (Programare, C++, Int, Scurt)

dayuloli a intrebat.

Există multe întrebări care solicită diferența între short și int tipuri de numere întregi în C++, dar, practic, când alegeți short peste int?

4 răspunsuri
dayuloli

(Vezi răspunsul lui Eric pentru o explicație mai detaliată)

Observații:

  • În general, int este setat la „mărimea naturală” – forma întreagă pe care hardware-ul o gestionează cel mai eficient
  • Atunci când se utilizează short într-o matrice sau în operații aritmetice, valoarea short întreg este convertit în intși, prin urmare, acest lucru poate duce la o reducere a vitezei de procesare. short numere întregi
  • Utilizarea short poate economisi memorie dacă este mai îngustă decât int, ceea ce poate fi important atunci când se utilizează o matrice mare.
  • Programul dvs. va utiliza mai multă memorie pe 32 de biți. int în comparație cu un sistem pe 16 biți. int de 16 biți.

Concluzie:

  • Utilizați int cu excepția cazului în care economisirea memoriei este esențială sau dacă programul dvs. utilizează o cantitate mare de memorie (de exemplu, multe matrice). În acest caz, utilizați short.

Comentarii

  • Notă: Nu există nicio garanție că o short utilizează de fapt mai puțină memorie decât un int, aceasta este definită de implementare. –  > Por clcto.
  • Extinderea zero/semn nu este scump. Nu m-ar deranja prea mult impactul asupra performanței. Odată ce stocați o mulțime de numere, alegeți tipul cu cea mai strânsă potrivire pentru a economisi memorie și, astfel, pentru a crește și localitatea cache-ului. Numărul redus de ratări ale memoriei cache va fi, de obicei, mai important decât costul extinderii de la short la int. –  > Por gexicide.
  • În cazul în care utilizarea memoriei este critică, atunci despart argumentele de numărare și caut o limită rezonabilă pentru valori, apoi folosesc cel mai mic tip de întreg care să cuprindă acest lucru. Utilizarea short pornind de la o noțiune vagă că este mai mic este atât riscantă (poate fi prea mare mică) și nesigură (s-ar putea să nu fie cât mai mică posibil). Atunci când vă pasă suficient de mult de utilizarea memoriei încât să vă abateți de la int, eu aș folosi doar [u]intX_t pentru o valoare adecvată X. – user395760
  • @delnan Re „reasonable bound”: atenție la [keyhole problem](se.ethz.ch/~meyer/publications/OTHERS/scott_meyers/keyhole.pdf) de a introduce restricții gratuite. –  > Por TemplateRex.
  • @TemplateRex Da, o problemă foarte reală, dar și mai gravă atunci când alegi în mod arbitrar un short (sau long sau char sau orice altceva), mai ales pentru că nici măcar nu ați stabilit în mod conștient o restricție care să fie oarecum ancorată în realitate (sau în versiunea de pe dos a realității), ci doar ați „salvat” o cantitate necunoscută de memorie prin introducerea unei restricții arbitrare, dependente de platformă, bazată pe un sentiment. – user395760
Eric Finn

Ați ales short în loc de int când:

Fie

  • Doriți să reduceți amprenta de memorie a valorilor pe care le stocați (de exemplu, dacă vizați o platformă cu memorie redusă),
  • Doriți să creșteți performanța prin creșterea fie a numărului de valori care pot fi împachetate într-o singură pagină de memorie (reducând erorile de pagină la accesarea valorilor) și/sau în memoria cache (reducând ratările de cache la accesarea valorilor), iar profilarea a arătat că există câștiguri de performanță în acest caz,
  • Sau trimiteți date prin rețea sau le stocați pe disc și doriți să reduceți amprenta (pentru a ocupa mai puțin spațiu pe disc sau lățime de bandă în rețea). Deși, pentru aceste cazuri, ar trebui să preferați tipurile care specifică exact dimensiunea în biți în loc de int sau short, care poate varia în funcție de platformă (așa cum doriți o platformă cu o dimensiune de 32 de biți short să poată citi un fișier scris pe o platformă cu o dimensiune de 16 biți. short). Bune candidate sunt tipurile definite în stdint.h.

Și:

  • Aveți o valoare numerică care nu trebuie să preia valori care nu pot fi stocate într-un short pe platforma țintă (pentru o unitate de 16 biți short, aceasta este -3276832767, sau 065535 pentru o platformă pe 16 biți unsigned short).
  • Platforma dvs. țintă (sau una dintre platformele dvs. țintă) utilizează mai puțină memorie pentru o short decât pentru un int. Standardul garantează doar că short este nu este mai mare decât int, astfel încât implementările sunt autorizate să aibă aceeași dimensiune pentru un short și pentru un int.

Notă:

chars pot fi, de asemenea, utilizate ca tipuri aritmetice. Un răspuns la „Când ar trebui să folosesc char în loc de short sau int?” s-ar citi foarte asemănător cu acesta, dar cu numere diferite (-128127 pentru un cod pe 8 biți char, 0255 pentru un 8 biți unsigned char)

În realitate, probabil că nu doriți să folosiți short în mod specific. Dacă doriți un număr întreg de o anumită dimensiune, există tipurile definite în <cstdint> care ar trebui să fie preferate, cum ar fi, de exemplu, un tip int16_t va avea 16 biți pe fiecare sistem, în timp ce nu puteți garanta dimensiunea unui short va fi aceeași pe toate țintele pentru care va fi compilat codul dumneavoastră.

Comentarii

  • Ținând cont de toate considerațiile enumerate mai sus, ați putea, de asemenea, să o luați în considerare pentru a vă diminua amprenta pe disc dacă scrieți multe date pe disc. –  > Por user1074069.
  • @user1074069 Bună idee. Am adăugat acest lucru (precum și menționarea trimiterii de date prin rețea) și am menționat că ar trebui să folosiți tipuri de numere întregi cu lățime fixă mai degrabă decât tipuri a căror lățime poate varia în funcție de platformă. –  > Por Eric Finn.
  • Nu există nicio garanție că accesarea unei pagini de memorie ca short (16 biți) este mai rapidă decât int (32 de biți). De exemplu, dacă doriți o cantitate de 16 biți din memorie, iar dimensiunea cuvântului procesorului este de 32, este posibil ca procesorul să fie nevoit să decaleze biții la stânga sau la dreapta pentru a-i plasa în poziția corectă. –  > Por Thomas Matthews.
  • De asemenea, accesarea a 2 cantități de 16 biți din memorie poate fi mai rapidă dacă se utilizează o căutare pe 32 de biți. Depinde de unitatea de gestionare a memoriei. –  > Por Thomas Matthews.
  • @ThomasMatthews Încercam să înțeleg că accesarea a 2048 de valori pe 16 biți este probabil mai rapidă decât accesarea a 2048 de valori pe 32 de biți, deoarece prima se potrivește într-o pagină de memorie (presupunând pagini de 4 KB), în timp ce a doua necesită 2 pagini de memorie. Există un alt mod de a formula răspunsul meu pentru a face acest lucru mai clar? Sau vreți să spuneți că presupunerea mea nu este valabilă? –  > Por Eric Finn.
Thomas Matthews

În general, nu preferați short în locul lui int.

Tipul int este dimensiunea nativă a cuvântului din procesor
De obicei, un int este dimensiunea cuvântului procesorului.

De exemplu, în cazul unui procesor cu dimensiunea cuvântului pe 32 de biți, an int ar fi de 32 de biți. Procesorul este cel mai eficient dacă folosește 32 de biți. Presupunând că short este de 16 biți, procesorul încă extrage 32 de biți din memorie. Așadar, nu există eficiență aici; de fapt, este mai mult timp, deoarece procesorul poate fi nevoit să decaleze biții pentru a fi plasați în poziția corectă într-un cuvânt de 32 de biți.

Alegerea unui tip de date mai mic Există tipuri de date standardizate care au o lungime specifică de bit, cum ar fi uint16_t. Acestea sunt preferate în locul tipurilor ambigue de char, short, și int. Aceste tipuri de date specifice lățimii sunt utilizate de obicei pentru accesarea hardware-ului sau pentru comprimarea spațiului (cum ar fi protocoalele de mesaje).

Alegerea unui interval mai mic
short se bazează pe intervalul nu pe lățimea de bit. Pe un sistem pe 32 de biți, atât short și int pot avea aceeași lungime pe 32 de biți.

Un motiv pentru a utiliza short se datorează faptului că valoarea nu va depăși niciodată un anumit interval. Acest lucru este de obicei un fals, deoarece programele se vor schimba și tipul de date ar putea depăși limitele.

Rezumat
În prezent, nu folosesc short nu mai folosesc. Eu folosesc uint16_t atunci când accesez dispozitive hardware pe 16 biți. Folosesc unsigned int pentru cantități, inclusiv pentru indicii de buclă. Folosesc uint8_t, uint16_t și uint32_t atunci când dimensiunea contează pentru stocarea datelor. Site-ul short tip de date este ambiguu pentru stocarea datelor, deoarece este un minim. Odată cu apariția stdint fișiere de antet, nu mai este nevoie de short.

Comentarii

  • Ce zici de un cuvânt în amd64? Pe platforma mea este pe 32 de biți, care nu este nici „cuvântul” de asamblare x86 pe 16 biți, nici dimensiunea reală a cuvântului nativ al unui procesor pe 64 de biți. –  > Por Big Temp.
Zaphod Beeblebrox

Dacă nu aveți constrângeri specifice impuse de arhitectura dvs., aș spune că puteți folosi întotdeauna int. Tipul short este destinat sistemelor specifice în care memoria este o resursă prețioasă.

Tags:, ,