MSVC Build Tools 14.52 RC: C++23 Üretime Hazır
Microsoft C++ ekibi, MSVC Build Tools 14.52 sürümünün release candidate yapısını yayına aldı. Bu sürümdeki en önemli başlık, C++23’ün artık üretim kullanımına hazır sayılması ve /std:c++23 derleyici seçeneğiyle doğrudan seçilebilmesi. Bunun yanında derleyici ön ucu, arka ucu, linker, standart kütüphane ve yan araçlarda 14.51’den bu yana biriken geniş bir değişiklik seti bulunuyor.
Sürümü Nasıl Edinirsiniz?
Release candidate, Visual Studio 2026 Insiders kanalı üzerinden indirilebiliyor. Bu kanalda C++ iş yükleriyle birlikte kurulan varsayılan araç zinciri artık 14.52. Kurulu olup olmadığını doğrulamak için Visual Studio Installer’da şu bileşenlerden birinin veya ikisinin işaretli olması yeterli:
- MSVC Build Tools for x64/x86 (Latest)
- MSVC Build Tools for ARM64/ARM64EC (Latest)
cl.exe ve link.exe tarafından yazdırılan sürüm numarası en az 14.52.37025 / 19.52.37025 olmalı. Bu, 14.52’nin kararlı duruma geçmeden önceki son önizlemesi; dolayısıyla karşılaşılan sorunların Visual Studio Developer Community üzerinden bildirilmesi öneriliyor. Microsoft’un açıklamasına göre 14.52’nin kasım ayında kararlı hale gelmesi ve Visual Studio 18.12 (Stable Channel) ile birlikte dağıtılması bekleniyor.
C++ Standart Uyumluluğunda Ne Değişti?
C++23 dil modu: C++23 kurallarını seçmek için artık /std:c++23 kullanılıyor. Mevcut /std:c++23preview yazımı çalışmaya devam ediyor ve bu seçeneğin takma adı durumunda; ancak önizleme biçimi kullanım dışı bırakıldı ve ileriki bir güncellemede kaldırılacak.
Immediate escalation: C++23’ün P2564R3 ile gelen immediate escalation davranışı, uygun constexpr fonksiyon ve lambda’ların kullanım gerektirdiğinde immediate hale gelmesini sağlıyor. Özellik C++23 ve sonrası modlarda etkin; C++20 derlemeleri /Zc:immediateEscalation ile bu davranışı açabiliyor.
Unicode tanımlayıcılar: C++23 ve C23 modları, P3658R1 ile tanımlanan matematiksel uyumluluk tanımlayıcı aralıklarını tanıyor.
Modüllerde constexpr allocation: Modül arayüzleri, içinde new T[n] ifadesi barındıran constexpr fonksiyonları temsil edebiliyor.
Ön işlemci:_Pragma daha fazla makro genişletme senaryosunda çalışıyor ve /E altında destekleniyor.
Constexpr cmath: Derleme zamanı cmath fonksiyonları /std:c++23 altında varsayılan olarak kapalı kalmaya devam ediyor; /Zc:cmath anahtarıyla etkinleştirilebiliyor.
C++/CLI, C ve dil araçları
/clrartık C++23 ve sonrası modlarda kullanılabiliyor.- Opt-in
/Zc:functionToObjectPtranahtarı, fonksiyon işaretçilerindenvoid*türüne örtük dönüşümleri reddediyor. - Derleyici, sanal temel sınıf içeren belirli
constexprkurucu şablon örneklemelerini kabul ediyor. Sabit değerlendirme sırasında bu sanal temellerin inşası hâlâ desteklenmiyor; dolayısıyla kapsam yalnızca bildirim denetimleriyle sınırlı. - C kodunda C4815 ve C4816, esnek dizi üyesi için depolama ayrılmadan yapı tahsis edildiğinde ya da esnek dizi üyesi olan bir yapı değerle geçirildiğinde uyarı veriyor.
- Linux C++ IntelliSense ayrıştırıcısı, C++20 ve C++23 standart seçeneklerini karşılık gelen dil modlarına eşliyor.
- Argument-dependent lookup, modülden dışa aktarılmayan daha fazla adı ele alıyor; iç içe şablon ve modül örneklemesi daha az sıklıkla başarısız oluyor.
- Modül serileştirmesi sınıf veri üyelerini ve şablon bilgisini daha tutarlı koruyor; birden çok modül aynı header unit’i paylaştığında tür birleştirme daha iyi çalışıyor.
- Header unit’ler makro boşluklarını koruyor, böylece string’e çevrilen makrolar gidiş-dönüşte bozulmuyor. Global module fragment’ta ilk kez tanımlanan türler daha güvenilir işleniyor.
- Matematik intrinsic’leri ve matematik başlıkları modüller ve sabit değerlendirmeyle daha tutarlı çalışıyor.
- Caret tanılamaları daha az bellek kullanıyor; birçok tanılama orijinal kaynak ifadesini daha doğru yeniden üretiyor.
- Ön işlemci tanılamaları hatalı ve iç içe sabit ifadeleri daha iyi tanımlıyor; geçersiz type-trait girdileri ve bozuk fonksiyon parametre kapsamları daha tutarlı ele alınıyor.
- Kullanım dışı bırakılmış, saf olmayan bir sanal fonksiyon override edildiğinde uyarı üretiliyor.
Kod Üretimi ve Optimizasyon
Inlining tarafında: LTCG, küçük bir dönüş nesnesinin hangi alanlarının çağıran tarafından okunduğunu dikkate alıyor; böylece inlining kullanılmayan alanları hesaplayan işi atabiliyor. Whole-program optimization, yerel bir nesnenin parçalarını açığa çıkarıp kullanılmayan store’ları kaldırılabilir hale getirdiğinde inline tercihine yöneliyor. Büyük bir outline edilmiş döngü gövdesi, döngüden çağrılan küçük bir sarmalayıcı üzerinden inline edilebiliyor. PGO ile birlikte, profil ve boyut sınırları izin verdiğinde küçük ve boyut için optimize edilmiş sanal çağrı hedefleri spekülatif olarak inline edilebiliyor. Inliner, fonksiyon işaretçisi değerlerini aggregate atamalar boyunca izleyerek şablon adaptörlerinde daha fazla dolaylı çağrı fırsatını koruyor. Tür tabanlı devirtualization artık profil güdümlü inlining ile birlikte çalışıyor; hot/cold bilgisi soğuk kodun sıcak çağıranlara çekilmesini daha etkili engelliyor.
Döngü ve skaler optimizasyonlar: Her yinelemede çalıştığı ve aliased işaretçiler arasında güvenli kaldığı kanıtlanan daha fazla değişmez yük döngü dışına taşınabiliyor. Eşitlik testli döngüler daha fazla loop-carried işten kurtuluyor, strength reduction taşmalı tam sayı induction ifadelerini daha geniş biçimde ele alıyor. Üç veya daha fazla çarpma aynı böleni paylaştığında optimizer tek bir karşılık hesaplayıp yeniden kullanabiliyor. Aliased alanlar üzerinden copy propagation varsayılan olarak açık ve boyutu bilinen memcpy ile memset işlemlerini anlıyor. x64 koşullu seçim daha fazla sıfırdan farklı sabiti ve güvenli aliased operandı işliyor. İşaretsiz karşılaştırmalar ve induction değişkeni aralıkları, sonraki optimizasyonlar için daha fazla sıfırdan farklılık, sıralama ve taşmama bilgisi üretiyor. Çağrılar bellek girişimini belirlerken restrict argümanlarını daha hassas kullanıyor. x86 optimizer’ı daha fazla yerel ve bloklar arası copy propagation yapıyor. Derleyici daha fazla rotate deyimi ile dinamik bit alanı çıkarma denetimini tanıyor ve gereksiz POPCNT zero extension işlemlerini kaldırıyor. Küçük aggregate optimizasyonu yalnızca padding içeren atamaları siliyor, uygun tüm-struct yüklemelerini ayrıştırıyor ve yerel memcpy işlemleri üzerinden uygun yüklemeleri iletiyor. Sabit dönüşümler, dönüşüm başka açılardan geçerliyse /fp:fast olmadan da katlanabiliyor. Daha erken loop-invariant motion ve daha geniş ifade yeniden ilişkilendirme sonraki aşamalara daha çok iş açıyor. Büyük fonksiyonlarda tekrarlanan ifadeler daha sık yeniden kullanılıyor; min/max ifadeleri, karışık işaretli karşılaştırma elmasları ve tekrarlı vektör eleman çıkarımları daha çok durumda sadeleşiyor. noexcept fonksiyonlara yapılan daha fazla dolaylı çağrı tail call’a dönüşüyor; depolaması gereksiz statik sabit diziler tamamen kaldırılabiliyor. Loop unswitching, vektörleştirmeden önce daha fazla iç içe döngü durumunu ele alıyor. Derleyici daha az attribute verisi üretiyor, exception bölgelerini daha az tarıyor, patolojik ölü kullanım aramalarını sınırlıyor ve büyük zincirli fonksiyon ifadelerini karesel yerine doğrusal sürede işliyor.
Vektörleştirme: x64 ve ARM64’te dallar aracılığıyla değer seçen daha fazla kod vektörleştiriliyor. sum += a[i] - b[i] gibi tam sayı indirgemeleri, döngü vektörleştiricinin tanıdığı biçime yeniden ilişkilendirilebiliyor. Vektör yükleme ve saklama işlemleri copy propagation ile scalar replacement aşamalarına daha erken ulaşıyor; bölmek yararlı vektör işlemlerini kaybettirecekse tam genişlikli vektörler bozulmadan kalıyor. Vektörleştirici daha fazla komşu adres desenini tanıyor ve sonuç vektör register’ında kalabildiğinde kullanıcı tarafından yazılmış SIMD değerlerini paketlemeye daha istekli. Döngüyle ilerletilen parametre türevli bir işaretçinin yerel bir diziyle aliasing yapmadığı daha çok durumda anlaşılıyor; böylece gereksiz çalışma zamanı örtüşme kontrolü atlanıyor. Döngü vektörleştirici, yalnızca bellek üzerinden yapılan takasları ve çok akışlı kopyaları — trivial tür dizileri üzerinde std::swap dahil — işleyebiliyor.
ARM64 ve ARM64EC
ARM64 tarafı bu sürümde yoğun biçimde ele alınmış. Derleyici ilişkili yükleme ve saklama işlemleri arasında adres hesaplarını paylaşıyor; buna fonksiyon parametrelerine dayalı array-of-structures döngüleri de dahil. Bu, tekrar eden aritmetiği kaldırıyor ve paired load/store fırsatlarını artırıyor. Bilinen NEON sabitleri gereksiz veri yüklemesi olmadan kurulabiliyor; skaler yüklemeler, broadcast’ler ve lane insert’leri daha çok durumda NEON yükleme komutlarına katlanıyor. Derleyici daha fazla NEON kurulum ve lane işlemini birleştiriyor, kullanılmayan lane insert’leri ile gereksiz maske karşılaştırmalarını eliyor.
Döngü vektörleştirici ek floor, ceil, trunc ve round işlemlerini destekliyor. Tail-call kararları artık çağrı bazında veriliyor; uygun olmayan tek bir çağrı aynı fonksiyondaki diğer uygun çağrıyı engellemiyor. ARM64 ve ARM64EC inlining’i kayan nokta ve vektör register baskısını hesaba katıyor; bu sayede kârlı native ARM64 inline’ları korunurken kısıtlı ARM64EC hedeflerinde aşırı spill önleniyor.
Komut seti tarafında: Native ARM64 SVE2, lane indeksli svmullb ve svmullt intrinsic’leri için kod üretimi ve disassembly destekliyor; çalıştırma SVE2 yetenekli donanım gerektiriyor. LUTI2 ve LUTI4 lookup-table desteği BF16 biçimlerini kapsıyor; kayan nokta mutlak minimum/maksimum komutları ile Common Short Sequence Compression işlemleri de destekleniyor — her aile ilgili işlemci özelliğini şart koşuyor. ARM64_FPMR, _ReadStatusReg ve _WriteStatusReg için FPMR register’ını adlandırıyor; armasm64 ve disassembler aynı adı tanıyor, çalıştırma FEAT_FPMR donanımı ve işletim sistemi izni gerektiriyor.
Native ARM64, özelleşmiş yorumlayıcı dağıtımı dahil olmak üzere __preserve_none ve [[msvc::musttail]] desteği kazandı. __preserve_none çağrı kuralı yalnızca C için geçerli ve ARM64EC’de desteklenmiyor.
/feature:sme ile derleyici, desteklenen harici bildirimlerde SME niteliklerini ve ZA durum türlerini kabul ediyor. Uygun skaler noexcept çağrıları gerekli streaming-mode geçişlerini yapabiliyor; belirli fonksiyon işaretçisi, referans, whole-program ve Control Flow Guard durumları dahil. Streaming fonksiyon tanımları, ZA taşıyan çağrılar, desteklenmeyen işaretçi biçimleri ile vektör veya aggregate argümanlar hâlâ desteklenmiyor; ARM64EC kapsam dışı. Native ARM64 CRT, TPIDR2, ZA ve ZT0 için AAPCS64 SME durum yönetimi rutinlerini sağlıyor; kullanılabilirlik işlemci ve işletim sistemi durum desteğine bağlı.
ARM64’te /Zc:cmath matematik çalışma zamanı artık kayan nokta ortamını destekliyor. Bu ilk uygulama matematik hatalarını errno yerine kayan nokta istisnalarıyla bildiriyor. Ayrıca ARM64 yığın yerleşimi, birbirini dışlayan switch durumlarındaki yerel değişkenler için slot’ları yeniden kullanabiliyor; bu da büyük switch yapılarının frame boyutunu belirgin biçimde küçültüyor. Durumsuz SVE all-true predicate’leri güvenlik ve kârlılık kontrolleri izin verdiğinde döngü dışına çıkabiliyor, ölü olduğu kanıtlanan switch kenarları switch genişletmesinden önce kaldırılıyor, bit alanı işlemleri mümkün olduğunda daha dar immediate biçimlerini kullanıyor. Register ataması daha fazla komşu yükleme çiftini koruyor ve sık kullanılan değerler için daha iyi spill/rematerialization kararları veriyor.
x64, x86 ve APX
Hız için optimize edilmiş x64 derlemelerinde sabit uzunluklu memcmp için daha fazla strateji var; 256 bayttan büyük uygun kopyalar büyük inline dizi yerine çalışma zamanı kopyalama yolunu kullanıyor. x64, jump-table adres hesaplarından önceki gereksiz zero extension işlemlerini daha çok kaldırıyor ve ikinin kuvveti sabitlere işaretsiz bölmeyi kaydırmaya indirgiyor. Sabit f64x2 atamaları birleşerek sonraki bir vektör işleminin tek bir 128-bit sabit taşımaya katlanmasını sağlayabiliyor. 32-bit x86 derlemeleri fmin, fmax ve copysign fonksiyonlarını inline edebiliyor; ARM64 ise copysign için aynı imkâna sahip. AVX2 ve AVX-512 hedefleri daha küçük register değerlerinden bellek üzerinden geçmeden geniş vektörler kurabiliyor. AVX-512 kod üretimi intrinsic operandları için uygun VEX taşımaları kullanıyor ve tek kullanımlık maskeli aritmetik ardından gelen blend işlemini tek bir merge-masked işleme katlıyor.
/feature:APX ile derlenen kod daha fazla aritmetik ve koşullu seçim biçimi, daha az gereksiz taşıma ve karşılaştırma, skaler tam sayı döngüleri için APX farkındalıklı unrolling ve strength reduction kararları kazanıyor. APX desteği artık ABI, assembler, disassembler ve hata ayıklama araçlarını kapsıyor: R30 ve R31 nonvolatile, register ataması bunları setjmp boyunca killed sayıyor, MASM ve disassembler uygun genişletilmiş register kodlamalarını işliyor, DIA ise APX register bağlamını okuyabiliyor.
Unwind V3 desteği kod üretimi, linking, ML64, DIA ve binary instrumentation katmanlarına yayıldı. Zincirlenmiş runtime-function kayıtları, büyük prolog ve epilog’lar, .PUSHFRAME/.POPFRAME ile stack walking kapsam dahilinde. ML64 için /unwindv3 gerekiyor; derleyici tarafında üretim varsayılan olarak yalnızca APX fonksiyonlarında açık ve stack walking V3 farkındalıklı işletim sistemi ve hata ayıklayıcı istiyor.
Ek olarak x64, atomik fetch-add dizileri dahil olmak üzere daha fazla condition-code güvenli INC/DEC biçimini tanıyor. AVX2 intrinsic lowering, uygun _mm_set_sd ve _mm256_set1_pd yollarında gereksiz skalerden vektöre taşımaları kaldırıyor. Tüm bitleri set eden vektör sabitleri ve eşli register işlemleri içeren fonksiyonlar daha iyi kod üretimi alıyor. Kaydırma aralığı analizi donanımın kaydırma sayısı maskesini modelliyor, komşu iki elemanlı double store’lar daha etkili birleşiyor. /O1 ve /Os altında ek ön tahsis optimizasyonları ve boyut farkındalıklı komut maliyetleri kod boyutunu düşürüyor. RDPRU ise gerektirdiği sabit register kısıtlarını kullanıyor.
Standart Kütüphane: C++23 Feature Complete
STL tarafındaki en dikkate değer gelişme, P0533R9 “constexpr For <cmath> And <cstdlib>” önerisinin uygulanmasıyla kütüphanenin C++23 feature complete hale gelmesi. Bu destek başlangıçta yalnızca MSVC için ve /std:c++23 /Zc:cmath bayrakları altında geçerli. Microsoft, ileriki bir sürümde /std:c++23 seçeneğinin /Zc:cmath davranışını ima etmesini beklediğini belirtiyor; şimdilik opt-in durumda. Clang ve EDG desteği, gerekli derleyici altyapısı hazır olduğunda etkinleştirilecek.
/std:c++latest /Zc:cmath altında ise C++26 P1383R2’nin <cmath> için getirdiği constexpr eklemeleri büyük ölçüde uygulandı; <complex> tarafında henüz değişiklik yok. Bazı fonksiyonlar LLVM-libc tarafından henüz uygulanmadığı için constexpr değil:
doubleiçin:acosh,asinh,atanh,cosh,sinh,tanhveerf.floatvedoubleiçin:erfc,lgammavetgamma.
MSVC 64-bit long double kullandığından her fonksiyonun üçüncü bir uygulamasına ihtiyaç duyulmuyor. Eksik fonksiyonlar kullanılabilir hale geldikçe sonraki sürümlerde constexpr olarak etkinleştirilecek.
Diğer STL başlıkları arasında standarttaki hata düzeltmeleri niteliğindeki 19 LWG issue çözümü, çeşitli senaryolarda iyileştirilmiş <regex> performansı ve birkaç STL algoritması için eklenen ARM64 SVE vektörleştirilmiş uygulamalar yer alıyor. Daha önce eklenen ARM64/ARM64EC NEON vektörleştirilmiş uygulamalardaki regresyonlar düzeltilmiş ve performans artırılmış. Microsoft, <regex> tarafındaki süregelen doğruluk ve performans elden geçirmesi için Julian Müller’e, vektörleştirme çalışması için Arm’dan Hari Limaye’ye teşekkür ediyor.
AddressSanitizer ve Araç Zinciri
AddressSanitizer tarafında yinelenen karantina işi kaldırılarak çalışma zamanı performansı iyileştirildi. Interception sırasında yedek komut uzunluğu çözücüsü olarak MSDIS (MSVC disassembler) kullanılmaya başlandı; bu “unrecognized instruction” hatalarını azaltıyor. Özellik varsayılan olarak açık ve ASAN_OPTIONS=windows_use_msdis_decoder=false ile kapatılabiliyor. Hangi komutların manuel çözücü yerine MSDIS tarafından yakalandığını izlemek için verbosity=3 ayarlanıp “MSDIS instruction decoder:” ön ekli kayıtlara bakılabiliyor. Ayrıca heap adres önbellekleme, daha verimli memory-mapped heap kontrolleri ve daha hızlı allocator flag atamaları gibi iyileştirmeler birden çok senaryoda belirgin kazanç sağlıyor.
Derleme araçları ve tanılama tarafındaki değişiklikler ise şöyle:
- C++ ön ucu daha fazla geçerli designated-initialization biçimini ve daha derin iç içe başlatıcıları kabul ediyor; eski ön işlemci daha büyük makro arabelleklerine izin veriyor.
- Code Analysis SARIF çıktısı varsayılan olarak kural adlarını, açıklamalarını ve yardım bağlantılarını, ayrıca mevcutsa etiketleri içeriyor.
- LNK2022 ve LNK4227 ilgili metadata öğesini adlandırıyor; LNK4323 eksik ARM64EC/native nesne çiftini açıklıyor.
- Incremental linking, program veritabanı dosyalarındaki fazla büyüme alanını kırpıyor.
- Disassembly kütüphanesi MIPS32 ve MIPS64 Release 6 komutlarını ve ARM64 matris durumu başlatma/durdurma komutlarını tanıyor.
/analyze:log:format:sarifandxmlher iki Code Analysis günlük biçimini birden yazıyor.- LNK4321, import kütüphanesi üretirken yinelenen C++ modül dışa aktarımlarını belirliyor.
- C5089,
/fsanitize=addressile kurulan deneysel kombinasyonu tanımlıyor.
Kimler Şimdi Denemeli?
Release candidate, kararlı sürüme geçişten önceki son önizleme olduğu için özellikle C++23’e geçiş planlayan, ARM64/ARM64EC hedefleyen ya da APX ve SME gibi yeni komut seti özelliklerini araştıran ekipler için doğru zamanlama sunuyor. Kod tabanınızda /std:c++23preview kullanıyorsanız, kullanım dışı bırakıldığı için /std:c++23 yazımına geçişi şimdiden planlamak mantıklı. Karşılaştığınız sorunları önizleme süresi dolmadan Developer Community üzerinden bildirmek, düzeltmelerin kararlı sürüme yetişme şansını artırıyor.
Kaynaklar ve İleri Okuma
- MSVC Build Tools Version 14.52 Release Candidate Now Available — Eric Brumer, Microsoft C++ Team Blog
- Visual Studio 2026 Insiders Channel
- Visual Studio Developer Community — C++
- STL Changelog (microsoft/STL wiki)
- MSVC C++23: constexpr cmath with LLVM Libc
- Bringing Correctly Rounded Math to Production with LLVM-libc
- P0533R9 — constexpr For <cmath> And <cstdlib>
- P1383R2 — More constexpr for <cmath> and <complex>
- LLVM libc math fonksiyon durumu
- STL LWG Issues projesi
- MSVC Build Tools 14.51 GA: Derleyici Tarafında Yeni Bir Sayfa
- MSVC Build Tools Preview Temmuz 2026: v14.52 Notları







Yorum gönder