来说说栈吧。。。

小白也疯狂 2013-07-27 04:50:14
通常所说的栈,不是很明白。
是不是一个程序共用一个栈呢?程序调用的函数,函数参数压栈,局部变量的创建全都是一个栈的内存吗?
...全文
569 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-08-07
  • 打赏
  • 举报
回复
一个进程可以多个线程,每个线程对应一个栈。 局部变量在栈上,但是未必在同一个栈上(不用区分在哪个栈上)。
mujiok2003 2013-08-07
  • 打赏
  • 举报
回复
引用 8 楼 my_live_123 的回复:
[quote=引用 4 楼 lijunbiao2080 的回复:] 应该说每个线程都有自己的栈
乱讲[/quote] 你认为当如何?
罗杰wise 2013-08-07
  • 打赏
  • 举报
回复
线程都会有自己的栈~ 在创建线程时候会要求设置大小,VC下默认是1M;参数的入栈、局部变量的内存分批都在这栈内进行。这里的线程是线程,与进程无关系。 操作系统的栈是系统栈,是在编译器编译时候决定大小的,用于线程和任务调度过程中的压栈和现场保存; malloc申请的空间实际上是来自与 "堆",与真正的栈还是有差别的。
赵4老师 2013-08-05
  • 打赏
  • 举报
回复
引用 11 楼 davidyu720 的回复: 有意思的是,除了用于参数的入栈、局部变量的内存分配以外,还可以使用_alloca在栈上动态分配内存。函数返回后,此动态分配的内存自动不可用,无需释放。在特定情况下,_alloca使用起来很方便。 正解! (在不考虑线程的情况下)
lm_whales 2013-08-05
  • 打赏
  • 举报
回复
单线程的程序,每个程序一个栈; 多线程程序,每个程序 N个栈,每个线程一个。 进程堆栈,和操纵系统有关,DOS 所有程序公用一个栈,除非程序自己重新设置堆栈段,小程序就不去设置了。大程序都会自己设置。 Windows ,每个进程至少一个栈--有多少线程通常有多少栈。 从NT的还是2000起,每个窗口程序至少有两个线程,所以至少两个栈。 其他操作系统,和实现有关。
fldmxp 2013-08-03
  • 打赏
  • 举报
回复
每个进程至少有一个线程,一个线程有且只有一个属于自己的栈(在你不使用汇编改变的时候)
fldmxp 2013-08-03
  • 打赏
  • 举报
回复
WIN32环境下确实是每个线程都有自己的栈的,看看CreateThread函数的参数就知道了。 支持,上面的说进程有自己的栈时我以为我out了,这么白痴的错也能出。 栈跟堆的主要区别应该是分配的方式与使用方法上的不同。 堆内存的分配方式是HeapAlloc,栈内存的分配方式是CreateThread时内核帮着分配的 使用方式的不同,在汇编代码执行push pop 或retn时,esp指向的栈内存的位置会改变 除此以外,静态存储区的分配方式应该是CreateFileMapping实现的
SKATE11 2013-07-29
  • 打赏
  • 举报
回复
引用 1 楼 dnvycumt3 的回复:
不一样的东西,函数参数压栈是指一种数据结构;而局部变量存放在栈区是一块内存区域。
可参考
酱油小龟 2013-07-29
  • 打赏
  • 举报
回复
引用 17 楼 lpcads 的回复:
[quote=引用 1 楼 dnvycumt3 的回复:] 不一样的东西,函数参数压栈是指一种数据结构;而局部变量存放在栈区是一块内存区域。
参数压栈的 push ,和局部变量 esp-4 处理的不是同一块内存区域区域吗?[/quote] 呵呵 我只是针对这两句话中栈这个字的含义。
酱油小龟 2013-07-29
  • 打赏
  • 举报
回复
引用 15 楼 nbabn 的回复:
[quote=引用 1 楼 dnvycumt3 的回复:] 不一样的东西,函数参数压栈是指一种数据结构;而局部变量存放在栈区是一块内存区域。
也没什么不一样的,函数参数压栈调用push指令,ESP-4,局部变量在函数被调用之初,ESP-n,一回事,都是在自己当前线程的栈空间上进行空间的分配,没什么区别。
引用 4 楼 lijunbiao2080 的回复:
应该说每个线程都有自己的栈
WIN32环境下确实是每个线程都有自己的栈的,看看CreateThread函数的参数就知道了。[/quote] 呵呵 我只是针对这两句话中栈这个字的含义。
lpcads 2013-07-29
  • 打赏
  • 举报
回复
引用 1 楼 dnvycumt3 的回复:
不一样的东西,函数参数压栈是指一种数据结构;而局部变量存放在栈区是一块内存区域。
参数压栈的 push ,和局部变量 esp-4 处理的不是同一块内存区域区域吗?
背包客的前奏 2013-07-29
  • 打赏
  • 举报
回复
1,当你的程序是一个单线程时,你的这个程序就共用一个栈。 整个运行环境中,内存分为堆和栈,我们通常所说的一般是指这里的栈。 堆是由程序员分配的内存,程序员要记得回收,不然就会造成所谓的内存泄漏,(最简单的malloc分配,free回收) 每个进程都有自己的栈,存放自动变量,局部变量,参数等
nbabn 2013-07-29
  • 打赏
  • 举报
回复
引用 1 楼 dnvycumt3 的回复:
不一样的东西,函数参数压栈是指一种数据结构;而局部变量存放在栈区是一块内存区域。
也没什么不一样的,函数参数压栈调用push指令,ESP-4,局部变量在函数被调用之初,ESP-n,一回事,都是在自己当前线程的栈空间上进行空间的分配,没什么区别。
引用 4 楼 lijunbiao2080 的回复:
应该说每个线程都有自己的栈
WIN32环境下确实是每个线程都有自己的栈的,看看CreateThread函数的参数就知道了。
tingyiye 2013-07-29
  • 打赏
  • 举报
回复
一个程序拥有很多进程,进程是分配资源的最小单位,系统分配的内存空间分为4快:静态存储空间、堆、栈、全局存储区,栈存的是临时的变量,堆存的是用户手动分配的空间。
max_min_ 2013-07-28
  • 打赏
  • 举报
回复
引用 1 楼 dnvycumt3 的回复:
不一样的东西,函数参数压栈是指一种数据结构;而局部变量存放在栈区是一块内存区域。
++可以这么说的!
dangyang1992 2013-07-28
  • 打赏
  • 举报
回复
引用 12 楼 lijunbiao2080 的回复:
[quote=引用 7 楼 dangyang1992 的回复:] 我也不明白,看大神回复,学习了
我怎么乱讲了,每个线程都有自己的栈,CreateThread的实收传入栈的大小,vc为每个线程默认的栈大小为1M。[/quote]额。。。貌似你弄错人了吧
lijunbiao2080 2013-07-28
  • 打赏
  • 举报
回复
引用 7 楼 dangyang1992 的回复:
我也不明白,看大神回复,学习了
我怎么乱讲了,每个线程都有自己的栈,CreateThread的实收传入栈的大小,vc为每个线程默认的栈大小为1M。
davidyu720 2013-07-28
  • 打赏
  • 举报
回复
有意思的是,除了用于参数的入栈、局部变量的内存分配意外,还可以使用_alloca在栈上动态分配内存。函数返回后,此动态分配的内存自动不可用,无需释放。在特定情况下,_alloca使用起来很方便。
davidyu720 2013-07-28
  • 打赏
  • 举报
回复
Each thread has a stack, where the linker sets the stack size of all threads created in a process. /STACK:reserve[,commit] option sets the size of the stack in bytes. The default stack size is 1 MB. 每个线程都有自己的栈,参数的入栈、局部变量的内存分批都在这栈内进行。
水平不流 2013-07-28
  • 打赏
  • 举报
回复
说法有问题.
加载更多回复(7)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧