Re: [問題] 面試遇到的compiler邏輯問題

看板C_and_CPP作者 (1597463007)時間11年前 (2015/01/06 00:33), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串2/2 (看更多)
基本上推文講的 aliasing 問題應該就是面試官想問的了 只是似乎這是面試官隨手出的題目所以有些不太嚴謹的地方 這是因為如果這段 code 會有 aliasing 問題 那應該要是對 myObj->ptr->a 賦值會影響到 myObj->ptr 的內容 也就是 myObj->ptr 跟 myObj 有 aliasing 使得 myObj->ptr->a 跟 myObj->ptr 被分到同一個記憶體位址 但這在 ptr 跟 a 是結構的兩個分別成員時並不會發生問題 只有在 union 時才有可能發生... 一個比較實際一點的例子是像在二元樹的狀況 struct TreeNode { /* blah blah */ TreeNode* left; TreeNode* right; }; 那麼 void process(TreeNode* node) { node->left->left = node->right->left; node->left->right = node->right->right; delete node->right; node->right = nullptr; } 這個看似沒什麼問題的函式 compiler 必須考慮到 node->left == node 的狀況 因此不能貿然地把 node->left 跟 node->right 提出去 我想這才是那位面試官想要問的東西 -- 話說回來, 就算不論 node->left == node 的狀況 上面這個函式其實還有別的問題 (就是原先的 node->left->left 跟 node->left->right 所指向的東西到底怎麼了) 不過這就跟 aliasing 問題無關而是指標管理的問題 這又是另一個可以寫上一篇長文的題材 (遠目) -- 'Oh, Harry, don't you see?' Hermione breathed. 'If she could have done one thing to make absolutely sure that every single person in this school will read your interview, it was banning it!' ---'Harry Potter and the order of the phoenix', P513 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.195.39.85 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1420475634.A.D68.html

01/06 14:43, , 1F
感謝您的講解!比我想像的複雜多了哈哈
01/06 14:43, 1F

01/06 16:05, , 2F
大推詳細
01/06 16:05, 2F

01/07 12:15, , 3F
大推(Y)
01/07 12:15, 3F
文章代碼(AID): #1Kghpore (C_and_CPP)
文章代碼(AID): #1Kghpore (C_and_CPP)