cpp对象方法有自己的堆栈框架吗?

时间:2013-10-15 04:39:12

标签: c++ concurrency stackframe

我在这里有一个假设,但验证起来有点困难。

当两个线程调用同一个对象实例的相同方法时,每个调用线程是否有唯一的堆栈帧?在一个已编译的二进制文件中,我理解一个类是一个静态代码段,在内存中填充了函数定义,不同对象之间的唯一区别是在引擎盖下传递的this指针。

但是因此调用它的线程必须有自己的堆栈帧,否则两个线程试图访问同一个对象实例的相同成员函数,会破坏彼此的局部变量。

这里重申一下,我并不是指两个线程是否可以通过同时修改this来破坏对象数据,我很清楚这一点。在两个线程同时进入同一个实例的相同方法的情况下,我是否更关注该上下文的局部变量是否与内存中的相同位置。同样,我的假设是他们不是。

3 个答案:

答案 0 :(得分:1)

你是对的。每个线程都使用自己的堆栈,每个堆栈使线程之间的局部变量不同。

这不是特定于C ++的。这就是处理器运行的方式。 (在现代处理器中,一些较旧的处理器只有一个堆栈,就像6502只有256字节的堆栈而没有实际运行线程的能力......)

对象可以在堆栈上并在线程之间共享,因此您最终可以在另一个线程堆栈上修改相同的对象。但只有当你分享那个特定的指针时才会这样。

答案 1 :(得分:0)

你是对的,不同的线程有唯一的堆栈。这不是c ++或cpp的功能,而是OS提供的功能。类对象不一定是不同的。这取决于它们的分配方式。不同的线程可以共享堆对象,这可能会导致并发问题。

答案 2 :(得分:0)

任何函数或类方法的局部变量都存储在每个自己的堆栈中(实际上放在线程的堆栈,堆栈帧中),所以从你正在调用的方法线程无关紧要 - 它将使用它自己的堆栈在每次通话执行期间

一个不同的解释:每个方法调用都会创建自己的堆栈(或更好的堆栈框架)

注意:静态变量将是相同的

当然存在一些技术可以在执行期间访问另一个方法的堆栈内存,但有一些黑客攻击