__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 ), false
pernyataan 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 | Sistem |
---|---|
__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