2009-08-12 19 views
8

È meglio trasmettere l'operando di destra dell'iter iteratore da size_t a int oppure iterare potenzialmente oltre il valore massimo di int? L'implementazione della risposta è specifica?Trasmetti da size_t a int o iterazione con size_t?

int a; 
for (size_t i = 0; i < vect.size(); i++) 
{ 
    if (some_func((int)i)) 
    { 
     a = (int)i; 
    } 
} 

int a; 
for (int i = 0; i < (int)vect.size(); i++) 
{ 
    if (some_func(i)) 
    { 
     a = i; 
    } 
} 
+1

Immagino tu intenda size_t ovunque la tua domanda dica type_t? Se è così, ti preghiamo di modificarlo. –

+2

Usa 'static_cast'. – GManNickG

+4

Si noti che 'size_t' e' int' non sono dello stesso tipo, anche su un sistema a 32 bit. 'size_t' non è firmato mentre' int' è firmato. Questo può essere un elemento significativo. –

risposta

7

io uso quasi sempre la prima variazione, perché trovo che circa l'80% del tempo, scopro che some_func probabilmente dovrebbe anche prendere un size_t.

Se in effetti some_func accetta un messaggio con firma int, è necessario essere consapevoli di ciò che accade quando vect diventa più grande di INT_MAX. Se la soluzione non è ovvia nella tua situazione (di solito non lo è), puoi almeno sostituire some_func((int)i) con some_func(numeric_cast<int>(i)) (vedi Boost.org per un'implementazione di numeric_cast). Questo ha il merito di lanciare un'eccezione quando il vect cresce più di quanto tu non abbia pianificato, piuttosto che avvolgersi silenziosamente a valori negativi.

+0

Mi piace l'idea che venga lanciata un'eccezione in questo caso, dal momento che elimina qualsiasi comportamento davvero strano ... Quindi, di nuovo, sarebbe una grande quantità di problemi, considerando che probabilmente non andrà mai a finire su 'INT_MAX'. –

+0

@Nick: Perché pensi che aggiungere una inclusione e usare un cast diverso (e uno appropriato, i cast di stile FTM-C non sono mai appropriati) è una seccatura. – sbi

+0

Una funzione dovrebbe "fare ciò che vuoi". Una funzione che "fa ciò che vuoi finché non viene superato un limite non documentato e poi fa qualcos'altro" è quella che viene comunemente definita una "mina terrestre". Lasciare mine nel codice è sempre una cattiva idea per qualcosa di diverso da un problema di compiti a casa. –

3

avevo appena lasciarlo come un size_t, dal momento che non c'è una buona ragione per non farlo. Cosa intendi con "o iterare potenzialmente fino al valore massimo di type_t"? Stai solo iterando fino al valore di vect.size().

1

Per la maggior parte dei compilatori, non farà alcuna differenza. Su sistemi a 32 bit, è ovvio, ma anche su sistemi a 64 bit, entrambe le variabili verranno probabilmente memorizzate in un registro a 64 bit e trasferite sullo stack come valore a 64 bit.

Se il compilatore memorizza valori int come valori a 32 bit nello stack, la prima funzione dovrebbe essere più efficiente in termini di cicli della CPU.

Ma la differenza è trascurabile (anche se la seconda funzione "guarda" più pulito)

+0

Grazie, sì, pensavo che il 2 ° aspetto fosse più pulito visto che c'è meno casting. Concordato? –