سؤال

لقد رأيت في عدد قليل من الأماكن التوصية للاستخدام std::array عبر مصفوفات النمط C في لغة C++، مدعيًا أنها بديل أفضل وأكثر أمانًا بدون أي تكاليف إضافية.يرى:

لا تحتوي مجموعة الحاويات القياسية [...] على النفقات العامة التي تحتاجها إلى الاحتفاظ بعناصرها ، [...].بمعنى آخر ، يشبه إلى حد كبير صفيف مدمج بدون مشاكل.(الأسئلة الشائعة حول لغة C++11)

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

لنفترض أن برنامجي يستخدم std::array في أماكن مختلفة مع عدة أعداد صحيحة مختلفة لـ N، هل سيؤدي هذا إلى كود متضخم؟هل هو لا يكاد يذكر؟

هل يجب أن أقلق بشأن هذا بالنسبة لمعلمات القالب غير النوعية بشكل عام؟

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

المحلول

لن أقلق بشأن ذلك.إذا نظرت إلى واجهة std::array<T, N>, ، إنها صغيرة جدًا ومعظم وظائف الأعضاء (توفر بشكل أساسي أغلفة لمعالجة المؤشر) عبارة عن سطر واحد سيتم تحسينه بالكامل/تضمينه بواسطة أي مترجم لائق على مستويات تحسين وضع الإصدار.

بالإضافة إلى، أنت لا تدفع مقابل ما لا تستخدمه نظرًا لأن وظائف الأعضاء غير الافتراضية غير المستخدمة (std::array<T, N> لا يمتلك virtual وظائف الأعضاء) لقوالب الفصل مضمونة بعدم إنشاء مثيل لها.اقتباس قياسي صغير:

14.7.1 الإنشاء الضمني [temp.inst]

11 لا يجوز للتنفيذ إنشاء قالب دالة ضمنيًا أو قالبًا متغيرًا أو قالبًا للأعضاء أو وظيفة العضو غير الذروة أو فئة عضو أو عضو في البيانات الثابتة في قالب فئة لا يتطلب مثيلًا.[...]

هناك أيضًا بعض العوامل العلائقية المثقلة == و < التي تعادل لغويا std::equal و std::lexicographical_compare.من الناحية العملية، يجب أيضًا تنفيذ هذه العوامل من حيث هذه الخوارزميات (اشتكي إلى البائع إذا لم يفعلوا ذلك).

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

ذات صلة ولكن ليست متطابقة:ال تقرير فني عن أداء C++ لقد قمنا بالكثير من المعايير الدقيقة على أغلفة الطبقة الرقيقة حول الأنواع المضمنة (int, double) ووجدت ما يقرب من الصفر في النفقات العامة لتقنية المترجم لعام 2006.يمكنك تكرار الاختبار للتحقق من ذلك std::array<T,N> ضد. T[N]

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