Avatar ·

ما هو std::span في C++ ومتى يجب استخدامه؟

مرحبًا أيها الزملاء! أكتب بلغة C++ منذ حوالي عام، لكني أواجه باستمرار مشكلة تمرير المصفوفات و buffers إلى الدوال. عادةً ما أمرر مؤشرًا للعنصر الأول والحجم بشكل منفصل، لكن هذا يبدو مرهقًا ويحتمل الأخطاء. على سبيل المثال:\n\n```cpp\nvoid process_data(int* arr, size_t size) {\n for (size_t i = 0; i < size; ++i) {\n // نفعل شيئًا مع arr[i]\n }\n}\n\nint main() {\n int data[] = {1, 2, 3, 4, 5};\n process_data(data, 5); // يعمل، لكن من السهل الخطأ في الحجم\n process_data(data, 100); // undefined behavior، خطأ!\n}\n```\n\nمؤخرًا صادفت `std::span` في C++20. قرأت التوثيق، لكني لم أفهم تمامًا ما هو أفضل من المؤشر العادي + الحجم. يبدو أنه مجرد "view" على المصفوفة. لماذا نحتاجه؟ متى يجب استخدامه بدلاً من