هل تريد السرعة؟ التمرير حسب القيمة: اعتبارات الأداء
يشير مبدأ "هل تريد السرعة؟ تمرير حسب القيمة" إلى أن تمرير الوسيطات حسب القيمة يمكن أن يؤدي أحيانًا إلى تحسين الأداء بسبب حذف النسخ. للتوضيح، خذ بعين الاعتبار الكود التالي باستخدام الفئتين X وY:
struct X {
std::string mem_name;
X(std::string name) : mem_name(std::move(name)) {}
};
struct Y {
std::string mem_name;
Y(const std::string &name) : mem_name(name) {}
};
int main() {
X(foo());
Y(foo());
}
هنا، تقوم foo() بإرجاع سلسلة مؤقتة تم تمريرها إلى كل من منشئي X وY. عندما يقوم X بتهيئة mem_name، فإنه يستدعي مُنشئ النقل لـ std::string، والذي من المحتمل أن يتجنب نسخ السلسلة. ومع ذلك، عندما يقوم Y بتهيئة mem_name، يجب أن ينسخ مرجع السلسلة.
وسيطات Lvalue vs Rvalue:
إذا تم تمرير قيمة l (غير مؤقتة)، فسيتم تمرير كل من X وسوف يقوم Y بإجراء نسخة. بالإضافة إلى ذلك، سيقوم X بإجراء خطوة. بالنسبة لقيم r (المؤقتة)، قد يقوم X بإجراء حركة فقط، في حين يجب على Y إجراء نسخة.آثار الأداء:
بشكل عام، تكون الحركة أسرع من التمرير مؤشر (أي ما يعادل التمرير حسب المرجع). لذلك، يتمتع X بأداء مماثل لـ Y بالنسبة للقيم l وأداء أفضل للقيم r.
تنبيه:
في حين أن "هل تريد السرعة؟ مرر بالقيمة" هي فكرة مقنعة، وينبغي تطبيقه بحكمة. من الضروري مراعاة السياق المحدد والحمل المحتمل المرتبط بنسخ هياكل البيانات الكبيرة. يوصى بالتوصيف لتحديد التأثير الفعلي على الأداء.
موارد إضافية:
[Scott Meyer's GN13 Talk] (https://www.youtube.com /watch?v=uk3-zmJWt-E) (الإطاران الزمنيان 8:10 و8:56)
[juanchopanza's المدونة: "هل تريد السرعة؟ لا تتجاهل القيمة (دائمًا)"]تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3