Avatar ·

ما هي قاعدة الأسماء المستعارة الصارمة (strict aliasing rule) في C++ وكيف تكسر الكود؟

مرحباً بالجميع. أنا أكتب بلغة C++ منذ حوالي عام، وواجهت مؤخراً مشكلة غريبة. لدي دالة تأخذ مؤشرين من نوعين مختلفين، وأتوقع أنها ستغير القيمة عبر مؤشر واحد ثم تقرأها عبر المؤشر الآخر. إليك مثال مبسط: ```cpp #include void foo(int* a, float* b) { *a = 42; *b = 3.14f; std::cout << *a; // أتوقع 42، لكني أحصل على 0 أو بيانات غير مرغوب فيها } int main() { int x = 10; // أقوم بعمل cast لتفسير ذاكرة int على أنها float foo(&x, reinterpret_cast(&x)); return 0; } ``` أتوقع أنه بعد كتابة `*a = 42` و `*b = 3.14f` يجب أن تكون قيمة `*a` هي 42، لكن يظهر شيء غريب. المترجم (GCC مع -O2) يتصرف وكأن كتابتي في `*b` لا تؤثر على `*a`. سمعت عن "strict aliasing rule"، لكني لا أفهم كيف تعمل هذه القاعدة بالضبط وكيف يمكن تجاوزها. لماذا يقوم المترجم بتحسين الكود الخاص بي مما يكسره؟ وكيف يمكن استخدام reinterpret_cast بشكل صحيح بين الأنواع المختلفة؟