2015-07-31 10 views
8

Quindi stavo leggendo un blog sull'ottimizzazione dell'ordinamento dei blocchi di un int e l'implementazione era in c. Sono venuto su questa linea che non capisco:statico davanti al numero in un programma c

void nibble_sort_bucket(uint64_t buf[static 1024]) { 

Il buffer è fondamentalmente di dati da ordinare e ogni int in esso ottiene i suoi blocchi di 4 bit ordinato, quindi è fondamentalmente per il benchmarking. Quando ho cercato l'uso dell'elettricità in c ho trovato due cose.

  1. Mantenere private le definizioni di funzione in un file.
  2. Mantenere un valore variabile tra le chiamate di una funzione.

Nessuno di questi ha senso qui. Qualcuno può spiegare perché mai scriverebbe statico di fronte a un numero e che cosa fa?

+1

qui potete trovare la risposta che state cercando: http://stackoverflow.com/questions/3430315/purpose-of-static-keyword-in-array-parameter-of-function – Mikser

+1

Se 'statica' è sovraccaricato, il linguaggio esploderà :( –

+0

Vedi anche: [Scopo della parola chiave static nel parametro array della funzione] (http://stackoverflow.com/questions/3430315/purpose-of-static-keyword-in-array -parameter di funzione) –

risposta

9

Questo è il terzo significato della parola chiave static, introdotta in C99, ma non è una funzione ben nota. Il suo scopo è quello di dire al compilatore che stai passando un array con almeno 1024 elementi.

Da C99 (N1256) §6.7.5.3/p7 dichiaratori di funzione (compresi i prototipi) (sottolineatura mia):

Se la parola chiave static appare anche all'interno della [ e ] dell'array tipo derivazione, quindi per ogni chiamata alla funzione, il valore dell'argomento effettivo corrispondente deve fornire l'accesso al primo elemento di un array con almeno altrettanti elementi come specificato dall'espressione di dimensione .

C'è qualche discrepanza tra le implementazioni effettive. Ad esempio, clang lancia un avviso, quando l'array passato non soddisfa il sottopunto secondario. Per esempio:

#include <stdio.h> 

void foo(int a[static 10]) {} 

int main() 
{ 
    int array[8] = {0}; 

    foo(array); 
} 

dà:

avvertimento: argomento di matrice è troppo piccolo; contiene 8 elementi, il chiamato richiede almeno 10 [-Warray-limiti]

mentre l'attuazione gcc non fa nulla (vedi GCC bug 50584 per ulteriori informazioni).

1

Questa dichiarazione buf[static 1024] indica al compilatore che buf è di almeno 1024 caratteri. È utilizzato per l'ottimizzazione, in altre parole, vuole dire che buf non può mai essere nullo.