تخطَّ إلى المحتوى

constexpr

الحساب وقت الترجمة constexpr

constexpr تفرض حساب القيمة أو الدالة وقت الترجمة كلما أمكن ذلك، فيصبح الناتج جاهزًا قبل حتى تشغيل البرنامج.

constexpr أقوى من const: const تقول «هذه القيمة لن تتغيّر»، أما constexpr تقول «هذه القيمة يجب أن تُحسب وقت الترجمة» — يعني صفر تكلفة وقت التشغيل. تُستخدم مع المتغيرات الثابتة المعروفة سلفًا (أحجام مصفوفات مثلًا)، ومع دوال بسيطة يريد المبرمج ضمان تنفيذها بوقت الترجمة عند الإمكان.

إذا استُدعيت constexpr function بقيم غير معروفة وقت الترجمة (مثل إدخال المستخدم)، يقبلها المترجم وتُنفَّذ عاديًا وقت التشغيل بدل الرفض.

الصياغة

constexpr Type name = expression;
constexpr ReturnType func(params) { ... }

📄 مثال

constexpr int square(int x) { return x * x; }

constexpr int SIZE = square(4); // يُحسب وقت الترجمة = 16
int arr[SIZE];                  // حجم معروف وقت الترجمة

std::cout << SIZE; // 16

أهم النقاط

العنصرالوظيفة
constexpr int xمتغيّر يُحسب وقت الترجمة، أقوى ضمانًا من const
constexpr functionدالة يمكن تنفيذها وقت الترجمة إن سُمحت الظروف
consteval (C++20)يفرض التنفيذ وقت الترجمة إجباريًا بلا استثناء

💡 نصائح عملية

  • استخدمها لأحجام المصفوفات الثابتة والقيم الرياضية المعروفة سلفًا — أداء أفضل بدون أي تكلفة
  • الدوال constexpr يجب أن تكون بسيطة نسبيًا (بدون I/O أو تخصيص ذاكرة ديناميكي معقّد)

⚠️ أخطاء شائعة

  • الخلط بين const وconstexpr وافتراض أنهما نفس الشيء دائمًا
  • محاولة استخدام قيمة غير معروفة وقت الترجمة (مثل مدخل مستخدم) كحجم مصفوفة عبر constexpr

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.