2009-08-12 17 views
8

¿Es mejor convertir la condición del iterador en el operando correcto de size_t a int, o iterar potencialmente más allá del valor máximo de int? ¿Es la implementación de la respuesta específica?¿Transmitir de size_t a int o iterar 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

Supongo que te refieres a size_t donde sea que tu pregunta diga type_t? Si es así, edítalo. –

+2

Use 'static_cast'. – GManNickG

+4

Tenga en cuenta que 'size_t' y' int' no son del mismo tipo, incluso en un sistema de 32 bits. 'size_t' no está firmado mientras' int' está firmado. Esto puede ser un elemento significativo. –

Respuesta

7

Yo casi siempre uso la primera variación, porque me parece que alrededor del 80% de las veces, descubro que some_func probablemente debería también tener un tamaño_t.

Si de hecho some_func toma un int firmado, debe tener en cuenta lo que sucede cuando vect se vuelve más grande que INT_MAX. Si la solución no es obvia en su situación (generalmente no lo es), al menos puede reemplazar some_func((int)i) con some_func(numeric_cast<int>(i)) (vea Boost.org para una implementación de numeric_cast). Esto tiene la virtud de arrojar una excepción cuando vect crece más de lo planeado, en lugar de ajustarse silenciosamente a valores negativos.

+0

Me gusta la idea de una excepción lanzada en este caso, ya que elimina cualquier comportamiento realmente extraño ... Por otra parte, sería una gran cantidad de molestias, teniendo en cuenta que probablemente nunca va a pasar por 'INT_MAX'. –

+0

@Nick: ¿Por qué crees que agregar un incluir y usar un elenco diferente (y uno adecuado, los moldes de estilo FTM - C nunca son adecuados) es demasiada molestia. – sbi

+0

Una función debe "hacer lo que quieras". Una función que "hace lo que quiere hasta que se cruza un límite no documentado y luego hace otra cosa" es lo que comúnmente se denomina "mina terrestre". Dejar las minas terrestres en su código es siempre una mala idea para cualquier cosa que no sea un problema de tarea. –

3

que acababa de dejarlo como un size_t, ya que no hay una buena razón para no hacerlo. ¿A qué te refieres con "o iterar potencialmente hasta el valor máximo de type_t"? Solo está iterando hasta el valor de vect.size().

1

Para la mayoría de los compiladores, no hará ninguna diferencia. En sistemas de 32 bits, es obvio, pero incluso en sistemas de 64 bits, ambas variables probablemente se almacenarán en un registro de 64 bits y se incluirán en la pila como un valor de 64 bits.

Si el compilador almacena int valores como valores de 32 bits en la pila, la primera función debería ser más eficiente en términos de ciclos de CPU.

Pero la diferencia es insignificante (aunque la segunda función "ve" más limpia)

+0

Gracias, sí, estaba pensando que el segundo se ve más limpio ya que hay menos casting. ¿Convenido? –