Megosztás:


Típus-minősítők

A típus-minősítők két tulajdonság egyikét adják meg egy azonosítónak. A const típus-minősítő egy objektumot nem módosíthatónak deklarál. A volatile típus-minősítő deklarál egy olyan elemet, amelynek az értékét jogszerűen módosíthatja a programon kívüli, például egy egyidejűleg végrehajtó szál.

A típus minősítők, constrestrictés volatile, csak egyszer jelenhetnek meg egy deklarációban. A típus-minősítők bármilyen típuskijelölővel megjelenhetnek; azonban nem jelennek meg a többelemes deklaráció első vesszője után. A következő nyilatkozatok például jogiak:

typedef volatile int VI;
const int ci;

Ezek a deklarációk nem jogiak:

typedef int *i, volatile *vi;
float f, const cf;

A típus-minősítők csak akkor relevánsak, ha az azonosítókat l-értékként érik el a kifejezésekben. Az L-Érték és az R-Érték kifejezésekkel kapcsolatos információkért tekintse meg az L-érték és az R-Érték kifejezéseket.

Szemantika

type-qualifier:
const
restrict
volatile

const és volatile

A következők jogi const és volatile nyilatkozatok:

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

Ha egy tömbtípus specifikációja típus-minősítőket tartalmaz, akkor az elem minősített, nem pedig tömbtípus. Ha a függvénytípus specifikációja minősítőket tartalmaz, a viselkedés nincs meghatározva. volatile és const ne befolyásolja az objektum értéktartományát vagy aritmetikai tulajdonságait.

  • A const kulcsszó használható bármely alapvető vagy összesítő típus módosítására, vagy bármilyen típusú objektumra mutató mutató vagy egy typedef. Ha egy elem csak a const típus-minősítővel van deklarálva, annak típusa const int lesz. A const változó inicializálható, vagy elhelyezhető egy írásvédett tárolási régióban. A const kulcsszó hasznos a mutatók deklarálásához, const mivel ehhez a függvénynek semmilyen módon nem kell módosítania a mutatót.

  • A fordító feltételezi, hogy a program bármely pontján elérhető egy volatile változó egy ismeretlen folyamattal, amely az értékét használja vagy módosítja. A parancssorban megadott optimalizálásoktól függetlenül a változókhoz való hozzárendelésekhez vagy hivatkozásokhoz volatile tartozó kódot akkor is létre kell hozni, ha úgy tűnik, hogy nincs hatása.

Ha volatile egyedül van használatban, int akkor a rendszer feltételezi. A volatile típuskijelölő használatával megbízható hozzáférést biztosíthat a speciális memóriahelyekhez. Olyan adatobjektumokkal használható volatile , amelyeket a jelkezelők, az egyidejűleg végrehajtó programok vagy speciális hardverek, például a memórialeképezett I/O-vezérlőregisztrálók érhetnek el vagy módosíthatnak. Deklarálhat egy változót az élettartamához hasonlóanvolatile, vagy egyetlen hivatkozást is megadhat.volatile

  • Egy elem lehet mindkettő const , és volatileebben az esetben az elemet nem lehetett jogszerűen módosítani a saját programjával, de valamilyen aszinkron eljárással módosítható.

restrict

A restrict C99-ben bevezetett típus-minősítő, amely elérhető vagy /std:c17módban is használható/std:c11 a mutatódeklarációkra. A mutatót minősíti, nem azt, amire mutat.

restrict a fordító optimalizálási tippje, amely szerint az aktuális hatókörben egyetlen más mutató sem hivatkozik ugyanarra a memóriahelyre. Vagyis csak a mutatót vagy az abból származtatott értéket (például mutató + 1) használja az objektum elérésére a mutató élettartama alatt. Ez segít a fordítónak optimalizáltabb kód létrehozásában. A C++-nak egyenértékű mechanizmusa van, __restrict

Ne feledje, hogy restrict ez egy szerződés Ön és a fordító között. Ha aliasként jelöl meg egy mutatót restrict, az eredmény nem lesz definiálva.

Íme egy példa, amely a következőket használja 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;
};

Lásd még

/std (A Language Standard verzió megadása)
Deklarációk és típusok