2010-10-27 23 views
5

Esta es una pregunta de mejores prácticas. Estoy haciendo una matrizQué tipo debo usar para una variable de índice

type * x = malloc(size*sizeof(type)); 

AFAIK sizeof da un valor de retorno de size_t. ¿Eso significa que debería usar size_t para declarar o pasar el tamaño? Además, al indexar la matriz ¿debo usar también un size_t para la variable de índice? ¿Cuál es la mejor práctica para estos? Esto no es algo que enseñaron en la escuela, y ahora que me estoy metiendo en serios C++ quiero saber.

Además, si alguien tiene referencias sobre dónde puedo encontrar las mejores prácticas para este tipo de cosas, ¿sería útil? Tipo de etiqueta para el libro de programadores.

EDIT: El malloc debe ser cudaHostAlloc, o cudaMalloc, ya que estoy desarrollando una clase que almacena una matriz de forma simultánea en el dispositivo y el host, y actualiza ambas al mismo tiempo. Así que malloc aquí solo es un marcador de posición de lo que realmente estaré haciendo.

+1

Un buen "mejor práctica" está usando 'sizeof' con la variable en uso:' tipo * x = (tipo *) malloc (tamaño * sizeof * x); 'De esta forma, si posteriormente actualiza el tipo en el tamaño de la mano izquierda, no necesitará actualizar el lado derecho (' sizeof (type) ') –

+0

+1 para una buena colocación pregunta. –

+5

Una buena práctica recomendada para C++ es no utilizar 'malloc()'. ¿Por qué lo estás usando? –

Respuesta

6

En general, utilizo lo que sea que minimice el número de moldes y errores de advertencia implícitos o explícitos. En general, hay una buena razón por la cual las cosas se escriben de la manera que son. size_t es una buena opción para el índice de matriz, ya que es unsigned y generalmente no desea tener acceso a myarray[-1], por ejemplo.

Por cierto, ya que es C++, debe salir del hábito de usar malloc (free) que es parte de CRT (biblioteca en tiempo de ejecución de C). Use new (delete), preferiblemente con smart pointers para minimizar el manejo manual de la memoria.

Una vez que haya dominado los conceptos básicos, una referencia de buenas prácticas (específica del idioma) es Effective C++ by Scott Meyers. El siguiente paso lógico es Effective STL.

+1

Una ventaja de utilizar int como índice es que puede iterar hacia abajo y tener una condición de terminación que comprueba si el índice es> = 0. –

+2

Verdadero - o bien, puede usar 'array :: rbegin()' y 'matriz: : rend() ' –

+0

@steve - Eso es si usted se ha familiarizado con la mejor práctica de usar arreglos" inteligentes "en lugar de los tipos brutos. –

4

En relación a su seguimiento en la pregunta: ¿

La mejor referencia que he utilizado para la programación de alto nivel general "buenas prácticas actuales" tipo de cosas es:

Code Complete by Steve McConnell (ISBN 0-7356-1967-0)

me refiero todo el tiempo Cuando mi compañía formalizó sus estándares de codificación, los escribí basados ​​en eso. No entra tanto en diseño o arquitectura, pero para sacar el código, el libro recibe el nombre apropiado.

+1

Es bueno, ¿qué dice acerca de este asunto? –

+0

Al final de la pregunta, dice: "Además, si alguien tiene referencias sobre dónde puedo encontrar las mejores prácticas para este tipo de cosas, ¿sería útil? Tipo de etiqueta para el libro de programadores". Esto es lo que proporcioné. No me di cuenta de que se suponía que debíamos ceñirnos al título de la pregunta y no desviarnos para responder a las preguntas de seguimiento. – Nate

0

Bueno, como ya has abandonado las mejores prácticas, incluso la BUENA práctica, utilizando malloc ... ¿por qué realmente importa?

Dicho esto, generalmente uso size_t a menos que necesite un tipo que puede ser negativo para varias condiciones semi-raras.

2

cudaMalloc toma un tamaño del tipo size_t, por lo que para coherencia, eso es lo que debe usar para los índices.

-1

yo preferiría int sobre size_t por un par de razones:

  1. tipos primitivos son preferibles a menos que el typedef ofrece algo fundamentalmente nuevo, size_t aquí no hace
  2. la size_t se define de manera diferente en diferentes sistemas , posiblemente creando sorpresas para algunos desarrolladores
  3. int firmado evita errores for (size_t i=9; i>=0; --i), así como otros errores en condicionales, por ejemplo if (result < 1) o if ((i-2)/2 < 1)

size_t es una abstracción inútil que las máscaras de comportamiento no deseado por subdesbordamientos silenciamiento

+1

1. 'size_t' es un typedef estandarizado para un tipo primitivo. 2. 'int' también varía de un sistema a otro. 3. Un buen compilador te avisará cuando digas 'i> = 0' para un tipo sin firmar. 'int' enmascara el comportamiento no deseado al silenciar desbordamientos. –

Cuestiones relacionadas