__assume
Microsoft'a Özgü
İyileştiriciye bir ipucu iletir.
Sözdizimi
__assume(
expression
)
Parametreler
expression
Ulaşılabilir kod için, değerlendirmesi varsayılan tüm ifadeler.true
İyileştiriciye ulaşılamayan kodu göstermek için kullanın 0
.
Açıklamalar
İyileştirici, tarafından expression
temsil edilen koşulun anahtar sözcüğün göründüğü noktada olduğunu true
ve değiştirilene kadar expression
(örneğin, bir değişkene atama yoluyla) doğru kaldığını varsayar. İyileştiriciye __assume
iletilen ipuçlarının seçici kullanımı iyileştirmeyi iyileştirebilir.
__assume
Deyimi bir çelişki (her zaman değerini false
veren bir ifade) olarak yazılırsa, her zaman olarak __assume(0)
kabul edilir. Kodunuz beklendiği gibi çalışmıyorsa, tanımladığınız kodun expression
daha önce açıklandığı gibi geçerli ve true
olduğundan emin olun. Deyimi __assume(0)
özel bir durumdur. Ulaşılmayan bir kod yolunu belirtmek için kullanın __assume(0)
.
Uyarı
Bir program ulaşılabilir bir yolda geçersiz __assume
bir deyim içermemelidir. Derleyici geçersiz __assume
bir deyime ulaşabiliyorsa, program öngörülemeyen ve potansiyel olarak tehlikeli davranışlara neden olabilir.
Derleyici seçeneği/Za
(Dil uzantılarını devre dışı bırak) belirtilmediği sürece, _assume
önceki sürümlerle uyumluluk için __assume
bir eş anlamlıdır.
__assume
gerçek bir iç değer değildir. İşlev olarak bildirilmesi gerekmez ve yönergesinde #pragma intrinsic
kullanılamaz. Kod oluşturulmasa da, iyileştirici tarafından oluşturulan kod etkilenir.
ASSERT
yalnızca onay kurtarılamazken kullanın__assume
. Derleyici hata işleme kodunu iyileştirebileceğinden, sonraki hata kurtarma kodunuz olan bir onayda kullanmayın __assume
.
Gereksinimler
Içsel | Mimari |
---|---|
__assume |
x86, ARM, x64, ARM64, ARM64EC |
Örnek
Aşağıdaki örnekte, deyiminin default
switch
büyük/küçük harfe ulaşılamdığını belirtmek için nasıl kullanılacağı __assume(0)
gösterilmektedir. En tipik kullanımıdır __assume(0)
. Burada programcı için tek olası girişlerin p
1 veya 2 olacağını bilir. için p
başka bir değer geçirilirse, program geçersiz hale gelir ve öngörülemeyen davranışlara neden olur.
// compiler_intrinsics__assume.cpp
void func1(int /*ignored*/)
{
}
int main(int p)
{
switch(p)
{
case 1:
func1(1);
break;
case 2:
func1(-1);
break;
default:
__assume(0);
// This tells the optimizer that the default
// cannot be reached. As so, it does not have to generate
// the extra code to check that 'p' has a value
// not represented by a case arm. This makes the switch
// run faster.
}
}
deyiminin __assume(0)
bir sonucu olarak, derleyici bir durum deyiminde temsil edilmeyen bir değer olup olmadığını p
test etmek için kod oluşturmaz.
İfadenin her zaman çalışma zamanında olduğundan true
emin değilseniz, kodu korumak için işlevini kullanabilirsiniz assert
. Bu makro tanımı deyimini __assume
bir denetimle sarmalar:
#define ASSUME(e) (((e) || (assert(e), (e))), __assume(e))
Servis talebi iyileştirmesinin default
çalışması için deyimi, __assume(0)
servis talebi gövdesindeki default
ilk deyim olmalıdır. Ne yazık ki, assert
makrodaki ASSUME
derleyicinin bu iyileştirmeyi gerçekleştirmesini engeller. Alternatif olarak, burada gösterildiği gibi ayrı bir makro kullanabilirsiniz:
#ifdef DEBUG
// This code is supposed to be unreachable, so assert
# define NODEFAULT assert(0)
#else
# define NODEFAULT __assume(0)
#endif
// . . .
default:
NODEFAULT;
END Microsoft'a Özgü