Pregunta

estoy experimentando con OpenCL para aumentar la velocidad de nuestro software. Trabajamos con mapas mucho y, para simplificar, representan un mapa como un std :: vector . El API OpenCL toma punteros prima de estilo c como argumentos, por ejemplo int * en el caso anterior.

Mis preguntas:

  • ¿Hay garantías de ejecución en el que STL vector es, a nivel interno, consecutivas en la memoria?
  • ¿Puedo lanzar con seguridad un std :: vector a int * y esperar que funcione?
  • En el caso de un vector de vectores, puede todavía asumir que esto es cierto? Yo esperaría que el vector para contener otros datos de estado, o problemas de alineación, o tal vez algo más ...
  • ¿Cuál es la mejor manera de abordar esto? Escribe una estructura de datos 2d personalizado que tiene una, tampón contigua-en-memoria interna y el trabajo con eso? Tendría que copiar a / de vectores mucho ...

Gracias.

¿Fue útil?

Solución

  

¿Hay garantías de ejecución en el que STL vector es, a nivel interno, consecutivas en la memoria?

A partir de C ++ 03, sí, un vector se garantiza para usar almacenamiento contiguo. (En C ++ 98, hubo un resquicio de manera accidental una implementación podría utilizar hipotéticamente almacenamiento no contiguo, pero se fijó en la revisión de la norma 2003 - y ninguna aplicación en realidad utiliza no contiguos almacenamiento debido a que sería una idea terrible)

  

¿Puedo lanzar con seguridad un std :: vector a int * y esperar que funcione?

La forma más habitual es &v[0]. (&*v.begin() probablemente funcionaría también, pero me parece recordar que hay algún texto suave y esponjosa en la norma que hace que este no es 100% fiable)

No. ¿Por qué se puede esperar que con el trabajo? Un vector es una clase. No es un puntero. Simplemente contiene un puntero.

  

En el caso de un vector de vectores, puede todavía asumir que esto es cierto? Yo esperaría que el vector se mantenga otros datos de estado, o problemas de alineación, o tal vez algo más ...

El vector se comporta de la misma lo almacena en el mismo. Si comete un vector de vectores, se termina con un objeto que contiene un puntero a una matriz de heap-asignado, donde cada elemento es un objeto que contiene un puntero a una matriz de heap-asignado.

En cuanto a cómo se debe abordar esto, depende de muchos factores. ¿Qué tan grande es su total de datos? Es posible que desee tener toda la tabla asignada de forma contigua. Con un vector de vectores, cada fila es una asignación separada.

Otros consejos

  
      
  • ¿Hay garantías de ejecución en el que STL vector es,
      internamente, consecutivas en la memoria
  •   

Sí, es una matriz dinámica. garantías estándar que los objetos en el interior del vector se almacenan de forma consecutiva.

  
      
  • ¿Puedo lanzar con seguridad un std :: vector a int * y esperar que funcione?
  •   

No, pero se puede utilizar begin () y el uso que a medida que el puntero.

  
      
  • ¿Hay garantías de ejecución en el que STL vector es,
      internamente, consecutivas en la memoria
  •   

No, desde vector puede contener algunas variables miembro internos toda la matriz 2D no será ubicación de memoria continua

  

¿Hay garantías de ejecución en el que STL vector es, a nivel interno, consecutivas en la memoria?

Código Aunque no puedo citar las normas aquí, he visto en las bibliotecas de alta calidad Suponiendo que esta disposición (es decir, POCO ).

  

¿Puedo lanzar con seguridad un std :: vector a int * y esperar que funcione?

En concreto, no se puede refundir el propio vector. Sin embargo, he visto el siguiente código:

std::vector<int> vec;
int* ptr = &vec[0];
  

En el caso de un vector de vectores, puede todavía asumir que esto es cierto? Yo esperaría que el vector se mantenga otros datos de estado, o problemas de alineación, o tal vez algo más ...

Es probable que no se puede emitir un vector de vectores a una serie lineal. Cada vector se reservará su propio rango de memoria y no se puede esperar que todos estos rangos ser secuencial.

Usted ha mencionado en un comentario de que se trabaja con hasta 2500x2500xsizeof de datos (doble). En ese caso, se recomienda usar un único vector en lugar de vector de vectores. Asignar elementos NxM en un vector y se envuelve en una clase de la exposición de la indexación de dos dimensiones, si se desea. Usted obtiene todos los beneficios de vector con una sobrecarga mínima y todos sus datos se encuentra todavía en memoria contigua para el procesamiento rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top