问题标签 [stack-frame]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 为什么堆栈中从低地址到高地址分配的结构的数据成员内存从高到低
为什么堆栈中从低地址到高地址分配的结构的数据成员内存从高到低?这个过程中的机制是什么?
gcc - 是什么决定了 gcc 是否为对齐做某事?
有两个简单的 C 源文件。第一个是 mainswap.c:
另一个是mainfoobar.c:
我得到了两者的可重定位目标文件。而且我发现 gcc 对 in 函数的堆栈帧的对齐做了一些事情main
,mainswap.c
同时 gcc 并没有明确地为函数main
in做一些事情mainfoobar.c
。
mainswap.c的主要内容:
mainfoobar.c 的主要部分:
我知道andl $-16, %esp
and的意图subl $32, %esp
。相同的 gcc 版本,相同的选项,相同的计算机,唯一的区别是 C 源文件。我的问题是为什么 gcc 对两个主要函数的处理方式不同,这种现象的背后是什么?</p>
另外,我使用的gcc版本是:
对了,在mainswap.c的函数main
中,我觉得subl $16, %esp
也能满足对齐和使用的需求,为什么gcc会浪费16个字节?</p>
c - 被调用函数在被调用后如何返回给调用者?
我读到,当程序调用函数时,被调用函数必须知道如何返回给调用者。
我的问题是:被调用函数如何知道如何返回给它的调用者?是否有通过编译器在幕后工作的机制?
c - 我们可以从函数名访问堆栈帧指针吗
有没有办法从 C 程序中的函数名称/地址访问堆栈帧指针?
我试图从 GDB 中的函数地址开始分析内存地址的内容,但无法获得任何有意义的信息。
有人可以给我一些提示吗?
谢谢。
c - 为什么堆栈中元素的地址在 ubuntu64 中颠倒了?
我编写了一个简单的程序来打印堆栈中元素的地址
输出:(在 ubuntu64 中,意外)
输出:(在 ubuntu32 中,如预期的那样)
ubuntu64的环境:
由上图可知,越早入栈的元素会定位到更高的地址,如果使用调用约定 cdecl ,最右边的参数会先入栈。推入参数后,局部变量要入栈
但输出在 ubuntu64 中按预期反转:
有什么想法吗?
gcc - 如何使用 gcc 指定堆栈帧大小?
将 valgrind 与程序一起使用,它显示
==940== 抑制,使用:--max-stackframe=48000588 或更大
==940== 大小为 4 的无效写入
==940== 在 0x80499EC:sequencer_run (stdio2.h :105)
==940== by 0x804DEF6: thread_start (thread.c:105)
==940== by 0x8049072: main (genome.c:237)
==940== 地址 0xbbd51340 在线程 1 的堆栈上
通过使用 max-stackframe 选项,可以抑制错误。但是我如何用 gcc 修改 max-stackframe 大小?我尝试使用
#define STACK_CHECK_MAX_FRAME_SIZE 48000588
但是没有用。我想我走错路了。请帮忙。
java - 从回调类执行代码时,Java 性能测试会发生变化。Java堆栈框架问题?
我试图编写一个相当通用的测试框架来分析一组函数,但遇到了一个我无法在下面详细说明的问题。
这个概念很简单。我创建了一个Test
抽象类:
然后,我有一个主测试类,包含一些配置信息和运行测试的循环。
查看这段代码,您可能想知道为什么该Test.run()
方法调用静态方法。那是因为最初我只是将硬编码调用嵌入到循环内的静态方法中。而不是打电话,tests[testIndex].run()
我会staticMethod1(quaternion)
在那里明确地打电话。这也意味着为每个方法重复这个循环代码——这导致我创建抽象基类,以便我可以创建一个回调数组来测试。
观察
因此,在切换到使用回调Test
类之后,我没有显式调用静态函数,而是观察到两件事:
- 每次调用的执行时间大大增加
- 执行时间几乎没有那么一致。
静态结果
这是我显式调用静态方法时的输出表(所有时间都以纳秒为单位):
回调结果
这是相同的代码,仅从我的抽象基Test
类执行:
重新审视问题
我能够形成的唯一猜想是,这可能与 Java 堆栈框架概念有关。我真的在找人来深入分析为什么会发生这种情况。
这些截然不同的结果可能会导致什么结果?
我从家里的电脑上重新运行了测试,所以我想我会重新发布这些结果以确保准确性。
回调(静态方法 1,静态方法 2)
回调(静态方法 2,静态方法 1)
使用 AxisAngle4f 的单个实例化回调 (staticMethod1, staticMethod2)
c++ - cpp 对象方法是否有自己的堆栈帧?
我在这里有一个假设,但验证起来有点困难。
当两个线程调用同一对象实例的相同方法时,每个调用线程是否有唯一的堆栈帧?在已编译的二进制文件中,我将类理解为在内存中填充函数定义的静态代码部分,不同对象之间的唯一区别是this
在引擎盖下传递的指针。
但是因此调用它的线程必须有自己的堆栈帧,否则两个线程试图访问同一个对象实例的同一个成员函数,将破坏彼此的局部变量。
在这里重申一下,我不是指两个线程是否可以通过同时修改来破坏对象数据this
,我很清楚这一点。我更了解在两个线程同时进入同一个实例的同一个方法的情况下,该上下文的局部变量是否在内存中的相同位置。同样,我的假设是它们不是。
python - 如何获取 Python 递归中使用的堆栈帧总数?
这是计算斐波那契数列的简单代码:
如果 n=10,我想知道这个计算涉及多少堆栈帧。有没有办法实时获取?
c++ - 函数从栈中返回的地址是什么?
我有以下代码
当我在 GDB 中调试代码时,我看到第二个参数由地址 ebp + 0xc (0xbffff188+0xc) 设置,第三个参数设置为 ebp + 0x10,而第一个参数不清楚在哪里,理论上,我们知道函数的返回地址是位于EBP+4,第一个参数是位于EBP+8,而....从我那里得到什么?