作者LPH66 (1597463007)
看板C_and_CPP
標題Re: [問題] 面試遇到的compiler邏輯問題
時間Tue Jan 6 00:33:51 2015
基本上推文講的 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