¿Cuál es la mejor manera de establecer todos los elementos de la matriz en un valor?

Tengo una serie de entradas y me gustaría establecer todos los valores de la matriz en ‘x’ cada vez que se llama a una función.

He visto memset pero eso solo funcionaría para una matriz de bytes, creo.

Podría hacer lo obvio para el bucle, pero supongo que hay una función lib estándar que lo logrará mejor. ¿Nadie sabe?

Solo enróllalo, más o menos. O memset a 0, si sabe que el valor es cero (similar para otros valores para los cuales tiene conocimiento de la representación de bits). No habrá una solución de biblioteca estándar, ya que la biblioteca estándar no puede conocer tipos de usuarios particulares.

Si estás en un sistema x86, puedes usar algún ensamblaje para esto. Por ejemplo, en gcc:

  __asm__( "rep stosb" : "=a"('x'), "=c"(count), "=D"(array) ); 

Debería hacer el truco.

rep stosb toma el valor en AL y lo asigna a ubicaciones de memoria consecutivas señaladas por ES:EDI . El número de las ubicaciones se especifica en ECX .

Además, en los procesadores recientes, Intel ha realizado muchos esfuerzos para mejorar el rendimiento de MOVSB y STOSB , por lo que esta es una buena manera de hacerlo.

Además de memset y looping (que son ambos tiempo O(n) ), en realidad se puede hacer en O(1) , pero al costo de triplicar la cantidad de memoria y búsquedas más costosas más adelante.

Este artículo describe cómo se puede hacer.

La idea es mantener la stack adicional (lógicamente, implementada como matriz + puntero hacia arriba) y la matriz, la matriz adicional indicará cuándo se inicializó por primera vez (un número de 0 a n) y la stack indicará qué elementos ya se modificaron.

Cuando accede a la array[i] , si stack[additionalArray[i]] == i && i < top el valor de la matriz es array[i] . De lo contrario, es el valor "inicializado".

Al hacer la array[i] = x , si aún no se ha inicializado (como se vio anteriormente), debe configurar la array[i] = x additionalArray[i] = stack[top] y boost la top .

Esto da como resultado la inicialización O(1) , pero como se dice, requiere memoria adicional y cada acceso es más amplio.

Por debajo de la lógica te ayudará.

 ... int a[100] = {0}; int b = 5; memset_ex(a, 100, &b, sizeof(int)); ... memset_ex(void *buf, int buf_size, void *value, int size_of_type) { int i = 0; for(i = 0; i <= (buf_size - size_of_type); i +=size_of_type) { memcpy((buf + i), value, size_of_type); } }