Esta pregunta tuvo una recepción bastante fría en SO, así que decidí eliminarla allí e intentarlo aquí. Si cree que tampoco encaja aquí, al menos deje un comentario sobre la sugerencia de cómo encontrar un ejemplo que estoy buscando ...
¿Puede dar un ejemplo en el que el uso de C99 VLAs ofrezca una ventaja real sobre algo como los mecanismos C ++ RAII de uso de montón estándar actuales?
El ejemplo que busco debería:
- Logre una ventaja de rendimiento fácilmente medible (10% tal vez) sobre el uso del montón.
- No tiene una buena solución, que no necesitaría toda la matriz.
- En realidad, se beneficia del uso del tamaño dinámico, en lugar del tamaño máximo fijo.
- Es poco probable que cause un desbordamiento de la pila en el escenario de uso normal.
- Sea lo suficientemente fuerte como para tentar a un desarrollador que necesita el rendimiento para incluir un archivo fuente C99 en un proyecto C ++.
Agregando algunas aclaraciones sobre el contexto: me refiero a VLA como lo entiende C99 y no está incluido en C ++ estándar: int array[n]
donde n
es una variable. Y busco un ejemplo de caso de uso en el que supera las alternativas ofrecidas por otros estándares (C90, C ++ 11):
int array[MAXSIZE]; // C stack array with compile time constant size
int *array = calloc(n, sizeof int); // C heap array with manual free
int *array = new int[n]; // C++ heap array with manual delete
std::unique_ptr<int[]> array(new int[n]); // C++ heap array with RAII
std::vector<int> array(n); // STL container with preallocated size
Algunas ideas:
- Funciones que toman varargs, que naturalmente limitan el recuento de elementos a algo razonable, pero no tienen ningún límite superior útil de nivel API.
- Funciones recursivas, donde la pila desperdiciada no es deseable
- Muchas asignaciones y lanzamientos pequeños, donde la sobrecarga del montón sería mala.
- Manejo de matrices multidimensionales (como matrices de tamaño arbitrario), donde el rendimiento es crítico, y se espera que las pequeñas funciones se alineen mucho.
- Del comentario: algoritmo concurrente, donde la asignación del montón tiene sobrecarga de sincronización .
Wikipedia tiene un ejemplo que no cumple con mis criterios , porque la diferencia práctica de usar el montón parece irrelevante, al menos sin contexto. Tampoco es ideal, porque sin más contexto, parece que el recuento de elementos podría causar un desbordamiento de la pila.
Nota: Estoy específicamente después de un código de ejemplo, o sugerencia de un algoritmo que se beneficiaría de esto, para que yo mismo implemente el ejemplo.
alloca
, que creo que son básicamente lo mismo). Pero esa cosa multiproceso es buena, ¡edición de preguntas para incluirla!
malloc
comportamiento de Linux se ajusta al estándar C.
alloca()
realmente eclipsaríamalloc()
en un entorno multiproceso debido a la contención de bloqueo en este último . Pero esto es una verdadera exageración ya que las matrices pequeñas solo deberían usar un tamaño fijo, y las matrices grandes probablemente necesitarán el montón de todos modos.