Avatar ·

C++ में सख्त उपनाम नियम (strict aliasing rule) क्या है और यह कोड को कैसे तोड़ता है?

सभी को नमस्कार। मैं लगभग एक साल से C++ में लिख रहा हूँ, और हाल ही में एक अजीब समस्या का सामना किया। मेरे पास एक function है जो दो अलग-अलग प्रकार के pointers लेता है, और मैं उम्मीद करता हूँ कि यह एक pointer के माध्यम से मान बदलेगा और फिर दूसरे के माध्यम से उसे पढ़ेगा। यहाँ एक सरल उदाहरण है: ```cpp #include void foo(int* a, float* b) { *a = 42; *b = 3.14f; std::cout << *a; // 42 की उम्मीद, लेकिन 0 या कचरा मिलता है } int main() { int x = 10; // मैं int मेमोरी को float के रूप में interpret करने के लिए cast करता हूँ foo(&x, reinterpret_cast(&x)); return 0; } ``` मैं उम्मीद करता हूँ कि `*a = 42` और `*b = 3.14f` लिखने के बाद `*a` का मान 42 होना चाहिए, लेकिन कुछ अजीब प्रिंट होता है। Compiler (GCC -O2 के साथ) ऐसा व्यवहार करता है जैसे `*b` में मेरी लिखाई `*a` को प्रभावित नहीं करती। मैंने "strict aliasing rule" के बारे में सुना है, लेकिन समझ नहीं पाया कि यह नियम कैसे काम करता है और इसे कैसे टाला जाए। Compiler मेरे कोड को क्यों optimize करता है, जिससे वह टूट जाता है? और विभिन्न प्रकारों के बीच reinterpret_cast सही तरीके से कैसे करें? कृपया मदद करें।