Así que estaba leyendo un blog sobre la optimización de la clasificación de bloques de un int y la implementación estaba en c. me llego esta linea que no entiendo:
void nibble_sort_bucket(uint64_t buf[static 1024]) {El búfer es básicamente datos para ordenar y cada int en él obtiene sus bloques de 4 bits ordenados, por lo que es básicamente para la evaluación comparativa. Cuando busqué el uso de estática en ci encontré dos cosas.
Ninguno de estos tiene sentido aquí. ¿Alguien puede explicar por qué alguna vez escribirías estático delante de un número y qué hace eso?
Ese es el tercer significado de la palabra clave static , que se introdujo en C99, pero no es una característica muy conocida. Su propósito es decirle al compilador que está pasando una matriz con al menos 1024 elementos.
De C99 (N1256) §6.7.5.3/p7 Declaradores de funciones (incluidos los prototipos) (énfasis mío):
Si la palabra clave
statictambién aparece dentro de[y]de la derivación del tipo de matriz, entonces, para cada llamada a la función, el valor del argumento real correspondiente proporcionará acceso al primer elemento de una matriz con al menos tantos elementos como se especifica por la expresión de tamaño .
Existe cierta discrepancia entre las implementaciones reales. Por ejemplo, clang lanza una advertencia, cuando la matriz pasada no satisface la subcláusula anterior. Por ejemplo:
#include <stdio.h> void foo(int a[static 10]) {} int main() { int array[8] = {0}; foo(array); }da:
advertencia: el argumento de la matriz es demasiado pequeño; contiene 8 elementos, el destinatario requiere al menos 10 [-Warray-bounds]
mientras que la implementación de gcc no hace nada (consulte el error 50584 de GCC para obtener más información).
Esta instrucción buf[static 1024] le dice al compilador que buf tiene al menos 1024 caracteres. Se usa para la optimización, en otras palabras, quiere decir que buf nunca puede ser nulo.