Kısa cevap, sadece static
yararlı olmakla kalmayıp, her zaman istenecek oldukça iyi olmasıdır.
İlk olarak, unutmayın static
ve constexpr
birbirinden tamamen bağımsızdır. static
yürütme sırasında nesnenin ömrünü tanımlar; constexpr
nesnenin derleme sırasında kullanılabilir olması gerektiğini belirtir. Derleme ve yürütme hem zaman hem de mekânda ayrık ve bitişik değildir. Dolayısıyla program derlendikten sonra constexpr
artık geçerli değildir.
İlan Her değişken constexpr
örtülü olduğunu const
ancak const
ve static
neredeyse diktir (etkileşim hariç static const
tamsayılar.)
C++
Nesne modeli (§1.9) tüm bit-alanları bellek en az bir bayt işgal ve adresleri dışında nesneleri gerektirir; ayrıca, belirli bir anda bir programda gözlemlenebilir tüm bu nesnelerin farklı adresleri olmalıdır (paragraf 6). Bu, derleyicinin yerel bir statik olmayan sabit diziye sahip bir işlevin her çağrılması için yığın üzerinde yeni bir dizi oluşturmasını gerektirmez, çünkü derleyici, as-if
bu tür başka hiçbir nesnenin olamayacağını kanıtlayabilmesi şartıyla sığınabilir. gözlemledi.
Ne yazık ki, işlev önemsiz olmadığı sürece bunu kanıtlamak kolay olmayacaktır (örneğin, gövdesi çeviri biriminde görünür olmayan başka bir işlevi çağırmaz), çünkü tanım gereği az çok diziler adreslerdir. Bu nedenle, çoğu durumda, statik olmayan const(expr)
dizi, her çağırmada yığın üzerinde yeniden oluşturulmalıdır, bu da derleme zamanında hesaplayabilme noktasını yener.
Öte yandan, yerel bir static const
nesne tüm gözlemciler tarafından paylaşılır ve ayrıca tanımlandığı işlev asla çağrılmasa bile başlatılabilir. Dolayısıyla, yukarıdakilerin hiçbiri geçerli değildir ve bir derleyici yalnızca bunun tek bir örneğini oluşturmakta özgür değildir; salt okunur depolama alanında bunun tek bir örneğini oluşturmak ücretsizdir.
Bu yüzden kesinlikle static constexpr
örneğinizde kullanmalısınız .
Ancak, kullanmak istemeyeceğiniz bir durum var static constexpr
. constexpr
Bildirilen bir nesne ODR kullanılmadığı veya bildirilmediği sürece static
, derleyici nesneyi hiç içermez. Bu oldukça faydalıdır, çünkü constexpr
derlenmiş programı gereksiz baytlarla kirletmeden derleme zamanı geçici dizilerinin kullanılmasına izin verir . Bu durumda, açıkça kullanımda istemem static
çünkü static
zamanında mevcut nesnenin zorlamak için muhtemeldir.
const
birconst
nesneden uzaklaşamazsınız , sadece bir nesneyiconst X*
işaret eden bir nesneden uzaklaşamazsınızX
. Ama mesele bu değil; önemli olan, otomatik nesnelerin statik adresleri olamaz. Söylediğim gibi,constexpr
derleme bittikten sonra anlamlı olmayı bırakıyor, bu yüzden atmak için hiçbir şey yok (ve muhtemelen hiçbir şey yok, çünkü nesnenin çalışma zamanında var olması bile garanti