Kvalifikátory typu
Kvalifikátory typu udávají identifikátoru jednu ze dvou vlastností. Kvalifikátor const
typu deklaruje objekt jako neupravitelný. Kvalifikátor volatile
typu deklaruje položku, jejíž hodnotu lze oprávněně změnit něčím, co je mimo kontrolu programu, ve kterém se zobrazuje, například souběžným spouštěním vlákna.
Kvalifikátory const
typu , restrict
a volatile
se můžou v deklaraci zobrazit pouze jednou. Kvalifikátory typu se mohou zobrazit s libovolným specifikátorem typu; Nemohou se však zobrazit za první čárkou v deklaraci více položek. Například následující deklarace jsou právní:
typedef volatile int VI;
const int ci;
Tyto deklarace nejsou legální:
typedef int *i, volatile *vi;
float f, const cf;
Kvalifikátory typu jsou relevantní pouze při přístupu k identifikátorům jako l-hodnot ve výrazech. Informace o l-hodnotách a výrazech najdete v tématu Výrazy L-Value a R-Value .
Syntax
type-qualifier
:
const
restrict
volatile
const
a volatile
Níže jsou uvedené právní const
předpisy a volatile
prohlášení:
int const *p_ci; // Pointer to constant int
int const (*p_ci); // Pointer to constant int
int *const cp_i; // Constant pointer to int
int (*const cp_i); // Constant pointer to int
int volatile vint; // Volatile integer
Pokud specifikace typu pole zahrnuje kvalifikátory typu, je kvalifikován element, nikoli typ pole. Pokud specifikace typu funkce zahrnuje kvalifikátory, chování není definováno. volatile
a const
neovlivňují rozsah hodnot ani aritmetické vlastnosti objektu.
Klíčové
const
slovo lze použít k úpravě jakéhokoli základního nebo agregovaného typu, ukazatele na objekt libovolného typu nebotypedef
. Pokud je položka deklarována pouze s kvalifikátoremconst
typu, považuje se její typ za const int. Proměnnouconst
je možné inicializovat nebo umístit do oblasti úložiště jen pro čtení. Klíčovéconst
slovo je užitečné pro deklarování ukazatelů naconst
, protože to vyžaduje, aby funkce ukazatel nijak nezměnila.Kompilátor předpokládá, že v libovolném okamžiku programu může být proměnná
volatile
přístupná neznámým procesem, který používá nebo upravuje její hodnotu. Bez ohledu na optimalizace zadané na příkazovém řádku musí být kód pro každé přiřazení nebo odkaz na proměnnouvolatile
vygenerován, i když se zdá, že nemá žádný účinek.
Pokud volatile
se používá samostatně, int
předpokládá se. Specifikátor volatile
typu lze použít k zajištění spolehlivého přístupu ke speciálním umístěním paměti. Používejte volatile
s datovými objekty, ke kterým mohou přistupovat nebo je měnit obslužné rutiny signálu, souběžným spouštěním programů nebo speciálním hardwarem, jako jsou řídicí registry V/V mapované paměti. Proměnnou můžete deklarovat jako volatile
pro její životnost nebo můžete přetypovat jeden odkaz na volatile
.
- Položka může být i
const
.volatile
V takovém případě nelze položku legitimním způsobem upravit vlastním programem, ale je možné ji upravit nějakým asynchronním procesem.
restrict
U restrict
deklarací ukazatele lze použít kvalifikátor typu zavedený v C99 a dostupný v /std:c11
režimu nebo /std:c17
. Kvalifikuje ukazatel, nikoli to, na co ukazuje.
restrict
je tip na optimalizaci pro kompilátor, že žádný jiný ukazatel v aktuálním oboru odkazuje na stejné umístění paměti. To znamená, že pro přístup k objektu se během doby životnosti ukazatele používá pouze ukazatel nebo hodnota z něj odvozená (například ukazatel + 1). To pomáhá kompilátoru vytvářet optimalizovanější kód. C++ má ekvivalentní mechanismus, __restrict
Mějte na paměti, že restrict
se jedná o smlouvu mezi vámi a kompilátorem. Pokud aliasujete ukazatel označený restrict
pomocí , výsledek není definován.
Tady je příklad, který používá restrict
:
void test(int* restrict first, int* restrict second, int* val)
{
*first += *val;
*second += *val;
}
int main()
{
int i = 1, j = 2, k = 3;
test(&i, &j, &k);
return 0;
}
// Marking union members restrict tells the compiler that
// only z.x or z.y will be accessed in any scope, which allows
// the compiler to optimize access to the members.
union z
{
int* restrict x;
double* restrict y;
};
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro