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 consttypu , restricta volatilese 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 nebo typedef. Pokud je položka deklarována pouze s kvalifikátorem const typu, považuje se její typ za const int. Proměnnou const 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ů na const , 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ěnnou volatile 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 . volatileV 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ý restrictpomocí , 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é

/std (Určení standardní verze jazyka)
Deklarace a typy