ProgramlamaC++ Gömülü Geliştirici

C++'da link-time ve compile-time sabitliğinin nasıl çalıştığını anlatın. constexpr ile const arasındaki fark nedir? Hangisini ne zaman kullanmalı?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

C++'da compile-time (derleme aşamasında) ve link-time (bağlama aşamasında) sabitlik vardır.

  • const değişkeni, başlatıldıktan sonra değiştirilemeyen bir nesnedir. Ancak const, değerin derleme aşamasında bilineceğini her zaman garanti etmez; bu değer yalnızca çalışma zamanında hesaplanabilir.
  • constexpr ise ifadenin veya işlevin derleme aşamasında zaten hesaplanacağını garanti eder.

Örnek:

const int x = time(0); // const, ama DEĞİL constexpr: değer çalışma zamanında hesaplanır constexpr int y = 2 + 2; // constexpr: derleme aşamasında bilinir constexpr int square(int x) { return x * x; } int arr[square(3)]; // dizinin boyutu — derleme zamanı ifadesi

Dizi boyutları veya şablon parametreleri gibi derleyiciye erişebilmesi gereken sabit ifadeler için constexpr kullanın.

Kandırmaca soru.

constexpr olarak tanımlanan bir işlev, sabit olmayan argümanlarla çağrılabilir mi?

Cevap: Evet! Eğer argümanlar derleme zamanında biliniyorsa, sonuç derleme aşamasında hesaplanır. Eğer argümanlar yalnızca çalışma zamanında biliniyorsa, işlev normal bir işlev olarak hesaplanır.

constexpr int double_val(int x) { return x * 2; } int val = std::rand(); int result = double_val(val); // Çalışma zamanında çağrılır

Konuya dair bilgi eksikliği nedeniyle ortaya çıkan gerçek hata örnekleri.


Hikaye

Modüllerden biri dizinin boyutunu const int ile tanımladı ve bunun derleme zamanı sabiti olduğunu düşündü. Başka bir derleyicide bu hata oluşturdu, çünkü değer çalışma zamanında hesaplandı ve dizinin boyutu standartlara uymadı.


Hikaye

Hash hesaplamalarında derleyici, const değişken kullanıldığı için hesaplamaları optimize edemedi, sonuç: yeni sürümlerde performansın %50'den fazla düşmesi.


Hikaye

Modern standartlara geçişte anahtar kelimeler karıştırıldı ve işlev const olarak değil, constexpr olarak tanımlandı, bu nedenle sonuç compile-time şablon ifadelerinde kullanılamadı. Hızlı bir analiz hata gösterdi, ama gözden geçirme işlemi master'a gitti.