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