Bagikan melalui


__assume

Khusus Microsoft

Meneruskan petunjuk ke pengoptimal.

Sintaks

__assume(
   expression
)

Parameter

expression
Untuk kode yang dapat dijangkau, ekspresi apa pun yang diasumsikan untuk dievaluasi ke true. Gunakan 0 untuk menunjukkan kode yang tidak dapat dijangkau ke pengoptimal.

Keterangan

Pengoptimal mengasumsikan bahwa kondisi yang diwakili oleh expression adalah true pada titik di mana kata kunci muncul dan tetap benar sampai expression dimodifikasi (misalnya, dengan penugasan ke variabel). Penggunaan petunjuk selektif yang diteruskan ke pengoptimal dengan __assume dapat meningkatkan pengoptimalan.

__assume Jika pernyataan ditulis sebagai kontradiksi (ekspresi yang selalu mengevaluasi ), falsepernyataan tersebut selalu diperlakukan sebagai __assume(0). Jika kode Anda tidak berulah seperti yang diharapkan, pastikan bahwa yang expression Anda tentukan valid dan true, seperti yang dijelaskan sebelumnya. Pernyataan itu __assume(0) adalah kasus khusus. Gunakan __assume(0) untuk menunjukkan jalur kode yang tidak dapat dijangkau.

Peringatan

Program tidak boleh memuat pernyataan yang tidak valid __assume pada jalur yang dapat dijangkau. Jika pengkompilasi dapat mencapai pernyataan yang tidak valid __assume , program dapat menyebabkan perilaku yang tidak dapat diprediksi dan berpotensi berbahaya.

Untuk kompatibilitas dengan versi sebelumnya, _assume adalah sinonim kecuali __assume opsi /Za pengompilasi (Nonaktifkan ekstensi bahasa) ditentukan.

__assume bukan intrinsik asli. Ini tidak harus dinyatakan sebagai fungsi dan tidak dapat digunakan dalam direktif #pragma intrinsic . Meskipun tidak ada kode yang dihasilkan, kode yang dihasilkan oleh pengoptimal terpengaruh.

Gunakan __assume hanya jika pernyataan tidak dapat dipulihkan ASSERT . Jangan gunakan __assume dalam pernyataan di mana Anda memiliki kode pemulihan kesalahan berikutnya karena pengkompilasi mungkin mengoptimalkan kode penanganan kesalahan.

Persyaratan

Intrinsik Arsitektur
__assume x86, ARM, x64, ARM64, ARM64EC

Contoh

Contoh berikut menunjukkan cara menggunakan __assume(0) untuk menunjukkan bahwa default kasus switch pernyataan tidak dapat dicapai. Ini adalah penggunaan yang paling khas dari __assume(0). Di sini, programmer tahu bahwa satu-satunya input yang mungkin untuk p akan menjadi 1 atau 2. Jika nilai lain diteruskan untuk p, program menjadi tidak valid dan menyebabkan perilaku yang tidak dapat diprediksi.

// 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.
   }
}

Sebagai hasil dari __assume(0) pernyataan, pengkompilasi tidak menghasilkan kode untuk menguji apakah p memiliki nilai yang tidak diwakili dalam pernyataan kasus.

Jika Anda tidak yakin bahwa ekspresi akan selalu berada true pada runtime, Anda dapat menggunakan assert fungsi untuk melindungi kode. Definisi makro ini membungkus __assume pernyataan dengan pemeriksaan:

#define ASSUME(e) (((e) || (assert(e), (e))), __assume(e))

Agar pengoptimalan default kasus berfungsi, __assume(0) pernyataan harus menjadi pernyataan pertama dalam isi kasus.default Sayangnya, assert dalam ASSUME makro mencegah pengkompilasi melakukan pengoptimalan ini. Sebagai alternatif, Anda dapat menggunakan makro terpisah, seperti yang ditunjukkan di sini:

#ifdef DEBUG
// This code is supposed to be unreachable, so assert
# define NODEFAULT   assert(0)
#else
# define NODEFAULT   __assume(0)
#endif
// . . .
   default:
      NODEFAULT;

END Khusus Microsoft

Baca juga

Intrinsik pengkompilasi
Kata kunci