Re: [問題] 面試遇到的compiler邏輯問題
基本上推文講的 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
01/07 12:15, 3F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 2 篇):