Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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
constkulcsszó használható bármely alapvető vagy összesítő típus módosítására, vagy bármilyen típusú objektumra mutató mutató vagy egytypedef. Ha egy elem csak aconsttípus-minősítővel van deklarálva, annak típusa const int lesz. Aconstváltozó inicializálható, vagy elhelyezhető egy írásvédett tárolási régióban. Aconstkulcsszó hasznos a mutatók deklarálásához,constmivel 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
volatilevá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ásokhozvolatiletartozó 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, ésvolatileebben 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