std::move vs.std::forward: الكشف عن التمييز في التعامل مع Rvalue
لقد قدم ظهور دلالات الحركة في لغة C وظيفتان حاسمتان لمعالجة ونقل مراجع القيمة: std::move وstd::forward. بينما يقوم كلاهما بتحويل كائن إلى نوع مرجعي، إلا أنهما يختلفان في سلوكياتهما المحددة وحالات الاستخدام. تأخذ الخطوة كائنًا وتحوله إلى مرجع rvalue. يعد هذا أمرًا مهمًا لأن مرجع rvalue يشير عادةً إلى أن الكائن المشار إليه يمكن اعتباره مؤقتًا ومن المحتمل أن يتم إبطاله بعد الاستهلاك. في الأساس، std::move يسمح لك بالإشارة إلى أنك تنوي "نقل" كائن من موقعه الحالي، مما قد يؤدي إلى تحرير الذاكرة الأساسية التي يشغلها.
std::forward: Perfect Forwarding من ناحية أخرى، فإن مراجع Rvalue
std::forward تخدم غرضًا محددًا: فهي تضمن أن تقوم الوظيفة بإعادة توجيه نوع مرجع الوسيطة إلى المتصل. يؤدي هذا إلى تمكين "إعادة التوجيه المثالي"، مما يعني أن وسيطات rvalue التي تم تمريرها إلى دالة ستستمر في معاملتها كقيم r داخل تلك الوظيفة. يعد هذا أمرًا بالغ الأهمية للحفاظ على الدلالات المقصودة لهذه القيم المؤقتة.
متى يتم استخدام أي
يعتمد الاختيار بين std::move وstd::forward على السياق والنتيجة المرجوة:
استخدم std::move
عندما تنوي نقل كائن، مما يشير إلى أنه لن يتم استخدام قيمته بعد ذلك وتريد استعادة ذاكرتها.عبر std::forward: بواسطة rvalue عبر std::move: بواسطة rvalue عن طريق التمرير البسيط: بواسطة rvalue
void overload(int const& arg) { std::cout void forwarding(t&& arg) { std::cout (arg)); std::coutفي المقابل ، يؤدي استدعاء إعادة التوجيه (x) بالقيمة l (x = 5) إلى إنتاج:
via std::forward: by rvalue via std::move: by rvalue by simple passing: by rvalueهنا، يقوم كل من std::forward وstd::move بإرسال القيمة l إلى مرجع rvalue، مع إبراز أدوارهما المميزة.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3