void EventsStack::push(Event *e){
EventNode *q = new EventNode();
q->data = e;
q->next = _top;
_top = q;
}
void main() {
EventsStack eventStack;
Event e1(1);
eventStack.push(&e1);
Event e2(2);
eventStack.push(&e2);
}
第一个问题:当我做的时候
eventStack.push(&e1);
我是否将e1的地址发送到推送功能,而推送功能将其作为指针接收?好像我在做:
Event *e = 1000 (1000 is the offset (address) of e1 for example on the stack)
第二个问题:我被要求在运行main函数时说明堆栈。当我到达行
eventStack.push(&e1);
将一个4字节的返回地址和一个指向e1的4byte指针作为函数的激活帧分配,或者在这种情况下没有激活帧,因为eventStack是EventStack类的一个对象,push是其成员函数之一?
答案 0 :(得分:1)
关于你的第一个问题:表达式&e1
需要
e1
的地址,这是一个指针。换句话说,e1
类型为Event
,&e1
类型为Event*
,值为{。}}
取消引用它(一元*
运算符)将具有
与使用e1
相同的效果。这就是你传递给推动者的东西
功能。
指针不能只是堆栈上的偏移量,因为它 必须可以从其他地方用它访问对象, 堆栈不一定可用的地方。最现代的 桌面机器使用线性寻址,这意味着 指针只是一个整数,但并不总是如此 在某些嵌入式处理器上可能并非如此 (以及某些大型机的历史原因)。
关于第二个问题:正式地说,它完全是
未指定的如何调用函数。有必要的是
编译器放置返回地址和参数
被调用函数可以找到它们的地方。在里面
表达式eventStack.push( &e1 )
,函数有两个
参数,eventStack
的地址(将成为。{
函数中的this
指针)和表达式&e1
。怎么样
编译器通过这些变化很大,差不多
总是取决于他们的类型,但通常,在大多数现代
机器,前3到5个参数将进入机器
注册它们是否合适(并且您传递的两个地址都将适用)
因此,所有被推到机器堆栈上的都是返回
地址。而参数通常不被认为是其中的一部分
当前帧,虽然在一些较旧的处理器上,编译器
确实如此对待他们。 (你说你是“被要求说明的
堆栈“。问题是指特定的机器
建筑,还是什么?堆栈上实际发生的事情会
编译器之间差异很大,Linux下的g ++会有所不同
经常做一些与Visual Studios完全不同的事情,
即使在同一处理器上运行。)
答案 1 :(得分:0)
关于第一个问题,是:&
运算符会产生事件的内存地址。
至于你的第二个问题,那很复杂。您所做的描述似乎表明了堆栈如何工作的潜在混淆。我强烈建议您阅读有关该主题的一些介绍性材料,这将使您更加了解。
如果你稍微去谷歌,几个小时后你就可以回答你自己的问题:)。