2010-07-27 14 views
5

Duplicar posible:
When to use std::size_t?C++, mejores prácticas, int o size_t?

hola.

Suponiendo que los patrones de uso son los mismos (es decir, no hay números negativos), que es preferible utilizar para varios índices, int o size_t tipo?

¿Hay diferencia de rendimiento en su experiencia en Intel de 64 bits entre los dos?

Gracias

+0

@Cha gracias, no he encontrado esta publicación antes. – Anycorn

Respuesta

1

Los tipos no es diferente en el sentido que insinúas, y generalmente int es de 32 bits, y size_t es la anchura de la plataforma de la palabra (32-64 bits). Sugiero que use size_t al tratar con archivos, búferes y cualquier otra cosa que pueda describir un área de memoria o un búfer.

Además, debe tener en cuenta que int está firmado, mientras que size_t no lo está.

Por último, int se utilizó históricamente donde size_t se debe utilizar ahora. Sin embargo, int sigue siendo útil por sí mismo para otros fines.

+0

gracias. Estoy tratando de estandarizar en mi proyecto en un tipo particular, para mejorar las interfaces en su mayoría, pero también para eliminar las advertencias del compilador. – Anycorn

1

size_t o ptrdiff_t. int podría no ser suficiente para acceder a todos los elementos de una matriz.

+1

@ dan04, es muy poco probable que int no sea suficiente. Lo más importante es que los contenedores estándar usan size_t, y como int está firmado mientras size_t no está firmado, puede obtener situaciones de comparación entre tipos firmados y no firmados. –

+0

@Michael Aaron Safyan: todo lo contrario, 'int' básicamente garantiza que será insuficiente en el caso general, ya que está * signed *, es decir, desperdicia un bit para el signo. – AnT

+0

@AndreyT, en teoría, sí, pero en la práctica, ¿cuándo realmente tienes una matriz de ese tamaño cargada en la memoria RAM? Si tiene esa cantidad cargada en la memoria RAM, probablemente haya algo mal con su diseño (probablemente debería estar transmitiendo datos y usando iteradores), o debería preocuparse por el tipo ... pero para casi todas las situaciones prácticas, usted va a lidiar con arreglos mucho más pequeños. –

5

Depende de lo que esté haciendo. Si está interactuando sobre un vector, a continuación, utilizar std :: size_t:

for (std::size_t i = 0; i < vec.size(); i++) { 
    // do something with vec[i] 
} 

Sin embargo, tenga cuidado con los errores de codificación tales como:

for (std::size_t i = 99; i >= 0; i--) { 
    // This is an infinite loop 
} 

Si se acaba haciendo un bucle, es posible que desee use solo un entero int debido a la situación anterior. No debe haber diferencia de rendimiento entre el uso de int y std :: size_t. Si necesita un tamaño exacto, no debe usar int ni size_t, sino los tipos definidos en stdint.h.

+2

Si está iterando sobre un 'std :: vector <>' (o cualquier otro contenedor estándar) puede usar 'std :: vector <> :: size_type' en lugar de atajar directamente a' std :: size_t'. – AnT

+0

@AndreyT, si a uno le preocupa la genericidad, entonces uno realmente debería usar iteradores. Si uno está preparando una función rápida que itera sobre un vector, entonces no hay nada que ganar de la más detallada std :: vector :: size_type en lugar de std :: size_t. –

+0

Me podría estar perdiendo algo aquí, pero ¿por qué el segundo ciclo es infinito otra vez? –

11

size_t es el tipo que se debe utilizar para la indexación de matrices cuando se trabaja con un relativamente matrices genéricas. Es decir. cuando solo tiene una matriz de abstract char s, int s u otra cosa.

Cuando está trabajando con una matriz específica, es decir, una matriz que contiene algunos elementos específicos para su aplicación, normalmente debería tener un "tipo de elección" para contar o indexar las entidades de ese tipo en su solicitud. Ese es el tipo que deberías usar. Por ejemplo, si alguna matriz contiene los registros para los empleados de la compañía, entonces ya debe tener un "tipo de elección" en su programa que use para designar la "cantidad de empleados". Ese es el tipo que debe usar para indexar matrices de registros de empleados. Podría ser unsigned int, podría ser employee_count_t o algo así. Usar un size_t desnudo para ese propósito es un error de diseño.

Tenga en cuenta también que size_t es un tipo que no está pensado para la indexación de matrices. Es un tipo destinado a representar el tamaño del objeto más grande en el programa. "Funciona" para matrices por transitividad: las matrices son objetos, por lo tanto, size_t siempre es suficiente para indexar una matriz. Sin embargo, cuando diseña un programa, tiene más sentido pensar en términos de contenedores genéricos , en lugar de pensar en términos de matrices específicas. Hoy podría ser una matriz, mañana podría tener que cambiar a una lista vinculada o un árbol en su lugar. En general, el rango de size_t no es suficiente para representar el número de elementos en un contenedor abstracto, por lo que size_t en tales casos no es una buena opción.

+2

@AndreyT, si mañana pudiera ser una lista o árbol vinculado, entonces un índice de cualquier tipo no es bueno. Para eso, necesitas iteradores. –

+0

@Michael Aaron Safyan: No necesariamente. Es posible construir una matriz segmentada de algún tipo, para lo cual el concepto de índice todavía tiene sentido, y que sin embargo no está limitado por el tamaño máximo de un bloque de memoria continuo. – AnT

+1

@AndreyT, pero las listas vinculadas no admiten el acceso aleatorio ... esto se está volviendo muy hackish y probablemente tendrá un rendimiento muy bajo. La solución más general es usar iteradores o visitantes. Los índices solo tienen sentido para los contenedores de acceso aleatorio. –