Aracılığıyla paylaş


__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 falseveren 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 trueolduğ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 pbaş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ü

Ayrıca bkz.

Derleyici iç bilgileri
Anahtar Sözcükler