ประการแรกinline
ข้อกำหนดเกี่ยวกับฟังก์ชันเป็นเพียงคำใบ้ คอมไพเลอร์สามารถ (และมักจะทำ) เพิกเฉยต่อการมีอยู่หรือไม่มีinline
คุณสมบัติ จากที่กล่าวมาคอมไพเลอร์สามารถอินไลน์ฟังก์ชันวนซ้ำได้มากพอ ๆ กับที่สามารถคลายการวนซ้ำแบบไม่สิ้นสุดได้ เพียงแค่ต้อง จำกัด ระดับที่จะ "คลาย" ฟังก์ชัน
คอมไพเลอร์ที่ปรับให้เหมาะสมอาจเปลี่ยนรหัสนี้:
inline int factorial(int n)
{
if (n <= 1)
{
return 1;
}
else
{
return n * factorial(n - 1);
}
}
int f(int x)
{
return factorial(x);
}
ลงในรหัสนี้:
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);
}
}
}
}
ในกรณีนี้เราได้ขีดเส้นใต้ฟังก์ชัน 3 ครั้ง คอมไพเลอร์บางคนทำดำเนินการเพิ่มประสิทธิภาพนี้ ฉันจำได้ว่า MSVC ++ มีการตั้งค่าเพื่อปรับระดับของการฝังในที่จะดำเนินการกับฟังก์ชันแบบเรียกซ้ำ (ฉันเชื่อว่ามากถึง 20)