Rumah >pembangunan bahagian belakang >C++ >Bolehkah Pengkompil Sebaris Berfungsi Rekursif?
Soalan:
Bolehkah pengkompil menyelaraskan fungsi rekursif seperti berikut?
inline int factorial(int n) { if(!n) return 1; else return n*factorial(n-1); }
Jawapan:
Ya, pengkompil boleh menyelaraskan fungsi rekursif, tetapi ia tidak selalu dijamin. Kata kunci sebaris hanyalah petunjuk kepada pengkompil bahawa ia mungkin bermanfaat untuk menyelaraskan fungsi. Pengkompil mempunyai keputusan muktamad sama ada ia benar-benar akan melakukan inlining atau tidak.
Proses Keputusan Pengkompil:
Terdapat pelbagai faktor yang dipertimbangkan oleh pengkompil semasa memutuskan sama ada untuk menyelaraskan fungsi atau tidak:
Contoh Pengoptimuman Pengkompil:
Pertimbangkan kod berikut:
inline int factorial(int n) { if (n <= 1) { return 1; } else { return n * factorial(n - 1); } } int f(int x) { return factorial(x); }
Pengoptimuman pengkompil mungkin menyelaraskan fungsi faktorial tiga kali, menghasilkan kod berikut:
int factorial(int n) { if (n <= 1) { return 1; } else { return n * factorial(n - 1); } } int f(int x) { if (x <= 1) { return 1; } else { int x2 = x - 1; if (x2 <= 1) { return x * 1; } else { int x3 = x2 - 1; if (x3 <= 1) { return x * x2 * 1; } else { return x * x2 * x3 * factorial(x3 - 1); } } } }
Pengoptimuman ini melancarkan rekursi sehingga tiga peringkat. Pengkompil boleh melakukan pengoptimuman ini untuk kedalaman rekursi dan tetapan pengoptimuman tertentu.
Atas ialah kandungan terperinci Bolehkah Pengkompil Sebaris Berfungsi Rekursif?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!