而栈的速度比堆的快,数组和局部变量蚂拿都是在栈上分配,效率比较高。
另外还有自由存储区、全局/静态存储区和常量存储区,此处不一一讲解了。
在启动文件里都要设置堆和栈的大小,这样合理的分配才不会造成资源悉誉的浪费。假如你代码中使用的链表占用空间比较大,这时你就需要把堆设置大一点。假如你使用的数组比较大,就得把堆设置大一点。最简单的方法可以测试一下栈大小,定义一个很大的数组int a[m]m足够大时就会栈溢出。
想更多的了解c语言具体内存分区的话去百度吧,就帮你到这里了
栈就是一个空携册樱间,声明时候产生。虚拟栈 来和 C 互传值。 栈上的的每个元素都是一个辩丛 Lua 值 (nil,数字,字符串,等等)。
无论何时 Lu a 调用 C,被调用的函数都得到一个新的栈, 这个栈独立于 C 函数本身的栈,也独立于之前的 Lu a 栈。 它里面包含了 Lu a 传递给 C 函数的所有参数,姿信 而 C 函数则把要返回的结果放入这个栈以返回给调用者
方便起见, 所有针对栈的 API 查询 *** 作都不严格遵循栈的 *** 作规则。 而是可以用一个 索引 来指向栈上的任何元素: 正的索引指的是栈上的绝对位置(从1开始); 负的索引则指从栈顶开始的偏移量。 展开来说,如果堆栈有 n 个元素, 那么索引 1 表示第一个元素 (也就是最先被压栈的元素) 而索引 n 则指最后一个元素; 索引 -1 也是指最后一个元素 (即栈顶的元素), 索引 -n 是指第一个元素。
当你使用 Lu a API 时, 就有责任保证做恰当的调用。 特别需要注意的是, 你有责任控制不要堆栈溢出。 你可以使用 lua_checkstack 这个函数来扩大可用堆栈的尺寸。
无论何时 Lu a 调用 C , 它都只保证至少有 LUA_MINSTACK 这么多的堆栈空间可以使用。 LUA_MINSTACK 一般被定义为 20 , 因此,只要你不是不断的把数据压栈, 通常你不用关心堆栈大小。
当你调用一个 Lua 函数却没有指定要接收多少个返回值时 (参见 lua_call), Lua 可以保证栈一定有足够的空间来接收所有的返回值, 但不保证此外留有额外的空间。 因此,在做了一次这样的调用后,如果你需要继续压栈, 则需要使用 lua_checkstack。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)