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

作者: LPH66 (-6.2598534e+18f)   2015-01-06 00:33:51
基本上推文講的 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 提出去
我想這才是那位面試官想要問的東西
作者: penknifelee (狂禪)   2015-01-06 14:43:00
感謝您的講解!比我想像的複雜多了哈哈
作者: final01 (牛頓運動定律)   2015-01-06 16:05:00
大推詳細
作者: cutekid (可愛小孩子)   2015-01-07 12:15:00
大推(Y)

Links booklink

Contact Us: admin [ a t ] ucptt.com