tipos significado programar programacion programa funciones ejemplos dev como comandos codigos c++ iterator aliasing

significado - programacion en c++



¿Hay algo así como una palabra clave restrict para C++ que indique que_iterators_ no tienen alias (1)

g ++ implementa __restrict__ para punteros, pero no pude encontrar nada sobre los iteradores. Mi intención general es alentar al compilador a vectorizar stl loops.

Editar:

Incluso si el compilador no puede vectorizar, la palabra clave __restrict__ debería ser capaz de decirle al compilador que no son necesarias recargas innecesarias dentro de un ciclo.


No sé la respuesta a tu pregunta directa. Sin embargo, el compilador solo podría vectorizar un bucle para std::vector , ya que es el único contenedor (creo) que tiene almacenamiento contiguo y no tiene dependencias entre ubicaciones de almacenamiento sucesivas (a diferencia, por ejemplo, std::list ). Sin embargo, no sé cómo hacerlo.

Actualizar

Después de algunos experimentos (que pueden o no ser relevantes para el objetivo general), descubrí que en ICC, lo siguiente no vectoriza:

typedef std::vector<float> V; V vec(4096); for (V::iterator it = vec.begin(); it != vec.end(); ++it) { *it *= *it; }

mientras que el siguiente hace:

V vec(4096); V::iterator it2 = vec.end(); for (V::iterator it = vec.begin(); it != it2; ++it) { *it *= *it; }

Aparentemente, el problema no es tanto los iteradores, sino la llamada a vec.end() dentro de la construcción del bucle, que aparentemente no se puede restar, aunque está claro que el cuerpo del bucle no afecta los límites del vector.

En GCC, no pude obtener nada para vectorizar. Esto no es sorprendente, porque GCC es mucho peor que ICC al detectar oportunidades de SSE.