Idem /O2 para VC++, aunque claro eso no sirve en lo absoluto para comparar el acceso a arrays:
main:
0000000000000000: 48 83 EC 28 sub rsp,28h
0000000000000004: 48 8D 0D 00 00 00 00 lea rcx,[??_C@_02IKAHHCAI@?$CFi?$AA@]
000000000000000B: BA 02 00 00 00 mov edx,2
0000000000000010: E8 00 00 00 00 call printf
0000000000000015: 33 C0 xor eax,eax
0000000000000017: 48 83 C4 28 add rsp,28h
000000000000001B: C3 ret
Por cierto con un ligero cambio se podria forzar el uso del array haciendo que en tiempo de compilacion no se sepa el valor a imprimir:
array[x] = rand() % 256 + 1;
Pero visto lo visto no tiene sentido el debate cuando se pasan de largo los argumentos.
En definitiva depende de la plataforma en primer lugar y como vimos
en PC no es mas o menos eficiente usar un array en la pila o en el monticulo en cuanto a acceso al mismo (ambos son memoria virtual que el S.O. se encarga de
mappear a RAM con ayuda del hardware y se usan las mismas instrucciones mov para acceder), otra cosa es la reserva/liberacion.