2013-04-28 13 views
23

C++ uçucu, statik uçucu kaydettirin. Ben etkileri ne olduğundan emin değilim, bu yüzden düşünüyorum:const uçucu, ben <strong>kayıt</strong>, <strong>const</strong> ve <strong>statik</strong> anahtar ile birlikte <strong>uçucu</strong> anahtar kelimenin farklı kullanımları hakkında merak ediyorum

register volatile int T=10; 

yere dışında (OS, donanım, başka bir iş parçacığı)

den değiştirilebilir bir kayıt ve T değerinin T saklamak için derleyici öner
const volatile int T=10; 

Programın kendisi T'yi değiştiremez, ancak T kodun dışında bir yerde değişiklik yapabilir. T, bir sınıfın bir veri elemanı ise

static volatile int T=10; 

bu sınıfın bütün nesneler dışında bir yerde modifiye edilebilir T ve T aynı değere sahip olduğu anlamına gelir. T bir dosyada global bir değişken ise, diğer dosyalardaki (projenin parçası olan) kaynak kodu T'ye erişemez, ancak T'ye dışarıdan bir yerden erişilebilir. T bir fonksiyonda lokal bir değişken ise, başlatıldıktan sonra programın sonuna kadar hafızada kalır ve dışarıda bir yerden değiştirilebilir.

Düşüncelerim doğru mu? Deneyimli bir C++ geliştiricisi, yukarıdakilerin gerçek dünya uygulamalarında kullanıldığı veya çok nadir olduğu bir örnek verebilir mi?

+0

Çok güzel! +1. Hatta 'mutable' içerebilir. –

cevap

26
register volatile int T=10; 

volatile eleme registerT ağır kullanılacak derleyiciye bir ipucu olsa da derleyici, optimizasyonlar uygulamak veya T erişimi yeniden sıralamak anlamına gelir. T adresinin alınması durumunda, ipucu derleyici tarafından basitçe yok sayılır. register'un kullanımdan kaldırıldığını, ancak hala kullanıldığını unutmayın.

Pratik Kullanım:

Ben bunun için gerek olmamıştı ve gerçekten şimdi herhangi hakkının düşünemiyorum kullanılan hiç.


const volatile int T=10; 

const eleme T kodu ile değiştirilemez anlamına gelir. Bunu yapmaya çalışırsanız, derleyici bir tanılama sağlayacaktır. volatile hala 1. durumda olduğu anlamına gelir. Derleyici, T erişimini optimize edemez veya yeniden düzenleyemez.

Pratik Kullanım:

  • salt okunur modda paylaşılan hafızayı erişme.
  • Salt okunur modda donanım kayıtlarına erişme. volatile hala optimizasyon ve yeniden sıralama tabi ise

static volatile int T=10; 

static depolama niteleyici, T statik depolama süresi (C++ 11 §3.7) ve internal linkage verir.

Pratik Kullanım: Statik depolama süresine sahip olduğu ve diğer çeviri birimlerinden erişilemez olması için nesne gerek dışında volatile olarak

  • aynı.
+2

İkincisi için, const-volatile * object * veya const-volatile * references * (veya const-volatile object için işaretçiler) hakkında konuştuğunuzdan emin misiniz? Çünkü bir yapının uçucu bir nesneye benzemiyor gibi görünebilir ... – Mehrdad

+1

@Mehrdad: Yapısal-uçucu nesneler için işaretçiyi şöyle ifade ediyordum: İmzasız char const volatile * hd_addr; –

+1

Evet, örnekte, “const volatile int T = 10;” ifadesi farklıdır. :) – Mehrdad

İlgili konular