سؤال

وأنا أعلم ذلك قوالب الوظائف يتم استخدامها لجعل الوظائف محمولة ويمكن استخدامها مع أي أنواع بيانات.

ايضا تخصص صريح يتم تنفيذ القوالب إذا كان لدينا تطبيق أكثر كفاءة لنوع بيانات معين.

ولكن بعد ذلك بدلا من تخصص صريح يمكننا أيضًا فقط رمز أ وظيفة nontemplate التي يمكن استدعاؤها من main . هذا من شأنه أن يوفر لنا بعض وقت المعالجة حيث يحدد المترجم وظائف nontemplate اسرع من وظائف templated متخصصة بشكل صريح والتي بدورها تكون أفضل من حيث الكفاءة.

فلماذا نستخدم تخصص صريح عندما يكون لدينا بديل للاتصال فقط وظائف nontemplate?

أرجوا أن تصحح لي إذا كنت مخطئا!

تحرير 1:أخبرني أستاذي أنه كلما صنعنا قوالب وظيفية واتصل بالوظيفة من main ، يبحث المحول البرمجي أولاً عن وظيفة تمثل ، وإذا لم يكن قادرًا على تحديد موقع ذلك ، فإنه يبحث عن قالب دالة يقوم منه بدوره بوظيفة محفوظة ثم يدعو إليها.

هل كانت مفيدة؟

المحلول

يبدو أنك تربك كفاءة وقت الترجمة مع كفاءة وقت التشغيل. يتم اختيار الوظيفة التي يجب الاتصال بها في وقت الترجمة ، وليس وقت التشغيل ، لذلك لن يحدث فرقًا في وقت تشغيل البرنامج.

يتم استخدام التخصص الصريح عندما يكون لديك حالة خاصة يمكن أن تستفيد من العلاج الخاص. في بعض الأحيان هذه النتائج العكسية ، كما في حالة std::vector<bool>, ، في حين أن في أوقات أخرى مفيدة للغاية. وهذا يعني أن مستخدم الوظيفة لا يحتاج إلى إدراك أن هناك حالة خاصة ؛ انها مجرد شفافة.

نصائح أخرى

هذا من شأنه أن يوفر لنا بعض وقت المعالجة لأن برنامج التحويل البرمجي سيحدد الوظائف العالمية بشكل أسرع من الوظائف المُنمئة المتخصصة بشكل صريح والتي سيكون بدورها أفضل من حيث الكفاءة.

لماذا يجد المترجم وظيفة غير متوفرة أسرع من تخصص قالب الوظيفة؟ هل قمت بتقييم الأداء المترجم للتحقق من هذا البيان؟ إذا كنت تستخدم وظيفة اسمها f, ، يتعين على المترجم دائمًا تجميع مجموعة من وظائف المرشح وإجراء دقة التحميل الزائد لتحديد الوظيفة الصحيحة التي سيتم استخدامها.

في وقت التشغيل (وهو عندما يكون الأداء مهمًا حقًا ، أليس كذلك؟) يجب ألا يكون أداء استدعاء قالب استدعاء استدعاء استدعاء وظيفة وظيفة أفضل من أداء استدعاء دالة غير معطلة.

فلماذا نستخدم التخصص الصريح عندما يكون لدينا بديل فقط للاتصال بالوظائف العالمية؟

في الحالة العامة ، بالنسبة لقوالب الوظائف ، لا تستخدم التخصص الصريح ، لأنه عادة ما يكون مربكًا وصعبًا. يحتوي معيار ISO C ++ على تحذير شعري ليكون حذرًا للغاية عند متخصص قوالب الوظائف. يمكنك قراءة Herb Sutter's "لماذا لا تتخصص قوالب الوظائف؟" للحصول على شرح جيد للمشكلات ولماذا لا ترغب في تخصص قوالب الوظائف.

لأسباب التوحيد. الشخص الذي يستخدم واجهة برمجة التطبيقات فقط يستدعي طرقًا باستخدام وسيطات معينة ، يحصل البعض على الوظيفة العامة التي يحصل البعض على وظائف متخصصة بشكل صريح - لا يحتاج العميل إلى معرفة ولا يهتمون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top