基本上推文讲的 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 提出去
我想这才是那位面试官想要问的东西