看板 C_and_CPP 關於我們 聯絡資訊
基本上推文講的 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
penknifelee: 感謝您的講解!比我想像的複雜多了哈哈 01/06 14:43
final01: 大推詳細 01/06 16:05
cutekid: 大推(Y) 01/07 12:15