Tag: 堆栈

为什么它使用movl而不是push?

注意这段代码: #include void a(int a, int b, int c) { char buffer1[5]; char buffer2[10]; } int main() { a(1,2,3); } 之后 : gcc -S ac 该命令在程序集中显示我们的源代码。 现在我们可以在main函数中看到,我们从不使用“push”命令将函数的参数推入堆栈。 它用“movel”而不是那个 main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $16, %esp movl $3, 8(%esp) movl $2, 4(%esp) movl $1, (%esp) call a leave 为什么会这样? 他们之间有什么区别?

如何查找变量是在堆栈还是堆中分配?

偶然发现这个面试问题, 在C中,给定变量x ,如何确定该变量的空间是在堆栈还是堆上分配? (有没有办法以编程方式找到它而不必通过符号表等?并且确定是否在堆栈或堆中分配空间有任何实际意义吗?)

使用Visual Studio确定堆栈空间

我在Visual Studio 2005中用C编程。我有一个multithreading程序,但这在这里并不是特别重要。 如何确定(大约)我的线程使用多少堆栈空间? 我计划使用的技术是将堆栈内存设置为某个预定值,比如0xDEADBEEF,运行程序很长时间,暂停程序,并调查堆栈。 如何使用Visual Studio读取和写入堆栈内存? 编辑:例如,参见“如何确定最大堆栈使用量”。 这个问题谈到了嵌入式系统,但在这里我试图在常规PC上确定答案。

内存中的字符串文字是什么? 堆栈/堆?

可能重复: C字符串文字:它们去哪儿了? 我所知道的, 通常,指针必须由malloc()分配,并将分配给堆,然后由free()取消分配; 和 非指针(int,char,float等)将自动分配给堆栈,并且只要函数返回就不会分配 但是,从以下代码: #include int main() { char *a; a = “tesaja”; return 0; } 分配到哪里? 堆栈还是堆?

在C / C ++中理解函数调用的堆栈框架?

我是C / C ++和汇编语言的新手。 这也可能是一个非常基本的问题。 我试图理解堆栈帧是如何构建的以及哪些变量(params)按什么顺序被推送到堆栈? 一些搜索结果显示…. C / C ++的编译器基于函数内执行的操作来决定。 例如,如果函数假设只是将传递的int参数的值递增1并返回(类似于++运算符),它会将函数和局部变量的所有函数和局部变量放在寄存器中并执行加法。 …想知道哪个寄存器用于返回/传递值?….如何返回引用? …..差异b / w eax,ebx,ecx和edx。 在函数调用期间使用/构建和销毁请求书籍/博客/链接或任何类型的材料来理解寄存器,堆栈和堆引用……以及如何存储主函数? 提前致谢

为什么你想要在堆而不是堆栈上分配内存?

可能重复: 何时最好使用堆栈而不是堆,反之亦然? 我已经阅读了关于堆与堆栈的其他一些问题,但它们似乎更关注堆/堆栈的作用而不是使用它们的原因。 在我看来,堆栈分配几乎总是首选,因为它更快(只需移动堆栈指针而不是在堆中查找空闲空间),并且在完成使用后不必手动释放已分配的内存。 我可以看到使用堆分配的唯一原因是,如果要在函数中创建对象,然后在函数作用域之外使用它,因为堆栈分配的内存在从函数返回后自动取消分配。 是否有其他原因使用堆分配而不是我不知道的堆栈分配?