ones代码如何访问不同栈帧中的成员变量
How does ones code access member variables in a different stack frame
class foo {
public:
foo() : foo_member1(1)
int foo_member1;
void do_something() {foo_member1++;}
}
int main(){
foo my_foo;
my_foo.do_something();
}
上述示例代码中的所有内容存储在哪里?这是我在开车回家的路上想到的事情,很尴尬我不能肯定地回答。
我在堆栈上创建了一个包含变量的对象。当我调用 do_something 并输入一个新的堆栈帧时,它如何访问作为 my_foo 对象的一部分存储在先前堆栈帧中的成员变量?是抄进来的吗?通过引用在下面默默地通过?还是它实际上最终在堆上?或者是否有一些特殊的机制,代码可以通过这种机制访问堆栈中位于它之前的内容?
这个:
my_foo.do_something();
通过传递隐藏参数 this = &my_foo
调用方法 foo::do_something()
。这只是一个普通的 C 函数,它只是获取一个隐藏参数。 do_something
的代码并没有真正访问 main
的堆栈帧,它只是使用 main
传递的 this
。
在do_something
内部,代码被视为:
this->foo_member1++;
没有跨框架访问。它只是一个指向内存位置的指针,恰好在 main 的框架中。在函数之间传递指针时没有内存保护。
class foo {
public:
foo() : foo_member1(1)
int foo_member1;
void do_something() {foo_member1++;}
}
int main(){
foo my_foo;
my_foo.do_something();
}
上述示例代码中的所有内容存储在哪里?这是我在开车回家的路上想到的事情,很尴尬我不能肯定地回答。 我在堆栈上创建了一个包含变量的对象。当我调用 do_something 并输入一个新的堆栈帧时,它如何访问作为 my_foo 对象的一部分存储在先前堆栈帧中的成员变量?是抄进来的吗?通过引用在下面默默地通过?还是它实际上最终在堆上?或者是否有一些特殊的机制,代码可以通过这种机制访问堆栈中位于它之前的内容?
这个:
my_foo.do_something();
通过传递隐藏参数 this = &my_foo
调用方法 foo::do_something()
。这只是一个普通的 C 函数,它只是获取一个隐藏参数。 do_something
的代码并没有真正访问 main
的堆栈帧,它只是使用 main
传递的 this
。
在do_something
内部,代码被视为:
this->foo_member1++;
没有跨框架访问。它只是一个指向内存位置的指针,恰好在 main 的框架中。在函数之间传递指针时没有内存保护。