这里的关键是,传递的参数的作用范围。
传递的参数“值” 会在 函数当前运行栈上 复制一份。所有的 操作和赋值 都是对那个 参数“值”副本 进行的。操作能够 改变成员变量,因为参数“值”副本 是一个 地址,能够正确指向成员变量的位置。而赋值 则根本没用,因为只是改变了当前函数栈内 参数“值”副本 的内容,而没有改变上一层函数栈内的 对应“值”。
这里涉及到的基本功常识为:
1. 每个Thread有自己的 运行栈。Stack
2. 每次函数调用,运行栈顶部上都会为 该函数调用 分配一个Stack Frame. 这也称为Context.
3. 函数调用结束,栈指针回到上一级函数调用的Context, Stack Frame, 刚才分配的顶部Stack Frame 就失效。上一级函数成为当前Stack Frame, Context。
4. 每次函数调用, 参数都会 压栈 压入运行栈。注意,这是非常重要的。
5. 压入运行栈内的 参数,是 Copy 了一份。注意,这也是非常重要的。所以,对参数 赋值,对上一级函数调用来说,是根本没有意义的。
因为只是改变了顶部Stack Frame里面 参数Copy的内容,根本不对上一级 Stack Frame 造成任何影响。
博客主要讲述了传递参数的作用范围,参数“值”会在函数当前运行栈复制一份,操作和赋值情况不同。还介绍了Thread相关基本功常识,如每个Thread有自己运行栈,函数调用时栈的分配、结束时栈指针变化,以及参数压栈和复制等情况。
9535

被折叠的 条评论
为什么被折叠?



