Tür Niteleyicileri
Tür niteleyicileri bir tanımlayıcıya iki özelliknden birini verir. Tür const
niteleyicisi bir nesneyi değiştirilemez olarak bildirir. Tür niteleyicisi volatile
, değeri göründüğü programın denetiminin dışında bir şey tarafından yasal olarak değiştirilebilen bir öğeyi (eşzamanlı olarak yürütülen bir iş parçacığı gibi) bildirir.
, ve volatile
tür niteleyicileri, restrict
const
bildirimde yalnızca bir kez görüntülenebilir. Tür belirleyicileri herhangi bir tür tanımlayıcısıyla birlikte görünebilir; ancak, birden çok öğe bildirimindeki ilk virgülden sonra görünemezler. Örneğin, aşağıdaki bildirimler yasaldır:
typedef volatile int VI;
const int ci;
Bu bildirimler yasal değildir:
typedef int *i, volatile *vi;
float f, const cf;
Tür niteleyicileri yalnızca ifadelerde l değerleri olarak tanımlayıcılara erişirken geçerlidir. l-değerleri ve ifadeleri hakkında bilgi için bkz. L-Value ve R-Value expressions.
Syntax
type-qualifier
:
const
restrict
volatile
const
ve volatile
Yasal ve volatile
bildirimler şunlardırconst
:
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
Bir dizi türünün belirtimi tür niteleyicileri içeriyorsa, öğe dizi türü değil nitelenmiş olur. İşlev türünün belirtimi niteleyiciler içeriyorsa, davranış tanımlanmamıştır. volatile
ve const
nesnenin değer aralığını veya aritmetik özelliklerini etkilemez.
anahtar
const
sözcüğü, herhangi bir temel veya toplama türünü ya da herhangi bir türdeki bir nesnenin işaretçisini ya da birtypedef
öğesini değiştirmek için kullanılabilir. Bir öğe yalnızca tür niteleyicisiconst
ile bildirilirse, türü const int olarak alınır. Birconst
değişken başlatılabilir veya depolamanın salt okunur bir bölgesine yerleştirilebilir. işlevininconst
işaretçiyiconst
hiçbir şekilde değiştirmemesi gerektiğinden, anahtar sözcüğü işaretçileri bildirmek için yararlıdır.Derleyici, programın herhangi bir noktasında, değerini kullanan veya değiştiren bilinmeyen bir işlem tarafından bir
volatile
değişkene erişilebileceğini varsayar. Komut satırında belirtilen iyileştirmelerden bağımsız olarak, birvolatile
değişkenin her atamasının veya başvurusunun kodu, hiçbir etkisi yokmuş gibi görünse bile oluşturulmalıdır.
Tek başına kullanılırsa volatile
varsayılır int
. Tür tanımlayıcısı volatile
, özel bellek konumlarına güvenilir erişim sağlamak için kullanılabilir. Sinyal işleyicileri tarafından erişilebilen veya değiştirilebilen, programları eşzamanlı olarak yürüten veya bellek eşlemeli G/Ç denetim kayıtları gibi özel donanımlar tarafından kullanılabilen veri nesneleriyle kullanın volatile
. Bir değişkeni yaşam süresi olarak volatile
bildirebilir veya tek bir başvuru olarak volatile
atayabilirsiniz.
- Bir öğe hem hem
volatile
deconst
olabilir. Bu durumda, öğe kendi programı tarafından meşru olarak değiştirilemez, ancak zaman uyumsuz bir işlem tarafından değiştirilebilir.
restrict
restrict
C99'da tanıtılan ve veya /std:c17
modunda kullanılabilen/std:c11
tür niteleyicisi, işaretçi bildirimlerine uygulanabilir. İşaretçiyi niteler, işaret ettiğinden değil.
restrict
, geçerli kapsamdaki başka hiçbir işaretçinin aynı bellek konumuna başvurduğunu derleyiciye yönelik bir iyileştirme ipucudur. Başka bir ifadeyle, işaretçinin ömrü boyunca nesneye erişmek için yalnızca işaretçi veya ondan türetilen bir değer (işaretçi + 1 gibi) kullanılır. Bu, derleyicinin daha iyileştirilmiş kod üretmesine yardımcı olur. C++ eşdeğer bir mekanizmaya sahiptir, __restrict
Bunun, siz ve derleyici arasındaki bir sözleşme olduğunu restrict
unutmayın. ile işaretlenmiş bir işaretçiyi diğer adla restrict
işaretlerseniz sonuç tanımlanmamış olur.
Aşağıda kullanan bir örnek verilmişti 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;
};
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin