2012-01-24 18 views
11

posso vedere uso pratico per una variabile qualificata const volatile, comeEsiste un uso pratico per un puntatore `volatile restrict`?

const volatile uint64_t seconds_since_1970; 

se un meccanismo hardware sottostante aggiorna il valore ogni secondo, ma la variabile non è scrivibile (eventualmente incorporato) hardware. E poiché tutti e tre i qualificatori di tipo (quattro in C11) sono considerati indipendenti, sembra che tutte le combinazioni siano consentite. Ma io sono in perdita immaginare una situazione di vita reale in cui un restrict volatile puntatore qualificato avrebbe davvero senso:

uint32_t * restrict volatile pointer_to_some_uint32; 

[EDIT: Per chiarire: Sia volatile e restrict applicano al puntatore, non l'oggetto puntato a!]

Si tratta di un costrutto permesso dal linguaggio ma inutile da solo, o mi manca qualche area applicativa in cui questo può essere utile?

+0

Quattro? 'const'' volatile' 'restrict' ...... Puoi dirmi qual è il quarto qualificatore? Scusa per le mie piccole conoscenze> o < – ikh

+0

@ikh C11 definisce un qualificatore '_Atomic'. –

risposta

8

Senza restrizioni, un puntatore non volatile potrebbe aliasare un puntatore volatile. Pertanto, dopo ogni modifica di un oggetto attraverso il puntatore volatile, i valori registrati nella cache di tutti gli oggetti con riferimento a puntatore potenziale dello stesso tipo devono essere eliminati.

Con la restrizione, è possibile indicare al compilatore che il puntatore volatile non sarà alias, in modo che il sovraccarico di volatile si applichi solo all'oggetto puntato e non a tutti gli altri oggetti dello stesso tipo che potrebbero essere accessibili tramite puntatori.

+0

Nel mio esempio il 'volatile' si applica al puntatore, non all'oggetto a cui punta. So che usare "volatile uint32_t * limita il puntatore;" può essere davvero molto utile, ma dichiarare che il puntatore stesso sia "volatile" e "restrict" non sposta il "volatile" sull'oggetto puntato, vero? –

+1

@Johan: Si consideri che un meccanismo hardware sottostante aggiorna 'pointer_to_some_uint32' di volta in volta (che è inverosimile, ma un'implementazione potrebbe farlo), e che inoltre l'indirizzo che scrive è garantito non essere aliasato da nessun altro puntatore. Quindi è 'volatile restrict'. Normalmente, 'restrict' è utile per gli argomenti di funzione e' volatile' è inutile per le variabili locali, quindi hai scelto un esempio che è improbabile che venga utilizzato anche se non è strettamente inutile. –

+0

@SteveJessop Sì, questa è anche la mia interpretazione. L'unica cosa che mi è venuta in mente è una sorta di garbage collector che riorganizza la memoria e corre in un contesto thread/processo diverso. Tali puntatori potrebbero validamente essere entrambi "volatili" (dal momento che il GC potrebbe cambiare i puntatori) e "restringere" se nessun altro puntatore punta alle sezioni GC-admin dei blocchi di memoria gestiti dal GC. Ma la risposta di @R .. sembra indicare che l'oggetto punta a "ereditare" il "volatile" ("il sovraccarico di volatile si applica solo all'oggetto puntato a"), che è IMHO errato. –

Problemi correlati