Kısa cevap, sadece staticyararlı olmakla kalmayıp, her zaman istenecek oldukça iyi olmasıdır.
İlk olarak, unutmayın staticve constexprbirbirinden tamamen bağımsızdır. staticyürütme sırasında nesnenin ömrünü tanımlar; constexprnesnenin 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 constexprartık geçerli değildir.
İlan Her değişken constexprörtülü olduğunu constancak constve staticneredeyse diktir (etkileşim hariç static consttamsayı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-ifbu 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 constnesne 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. constexprBildirilen bir nesne ODR kullanılmadığı veya bildirilmediği sürece static, derleyici nesneyi hiç içermez. Bu oldukça faydalıdır, çünkü constexprderlenmiş programı gereksiz baytlarla kirletmeden derleme zamanı geçici dizilerinin kullanılmasına izin verir . Bu durumda, açıkça kullanımda istemem staticçünkü staticzamanında mevcut nesnenin zorlamak için muhtemeldir.
constbirconstnesneden 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,constexprderleme 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