从程序员的角度,heap和链表没有任何关系,程序员是无法通过heap中使用的第一个内存区域遍历其他所有区域的。只能说某些OS使用类似链表的数据结构来管理内存。 这个说法是不准确的,stack的空间是在线程创建的时候就commit好的,入栈操作只是栈顶指针的改变,不存在开辟空间的问题。 其实C++中也是可以用malloc分配内存的。malloc和new的区别在于new会自动调用构造函数而malloc不会。 stack的大小不是OS规定的,而是编译时由编译器确定的。楼主所说的2M或者1M应该是某种编译器的默认stack大小吧。要调整stack的大小只需要编译时指定适当的编译参数就可以了。不过通常编译器的默认stack大小是足够的,如果程序中出现stack overflow一般都是代码或算法的问题 heap的大小并非只是受限于虚拟内存大小,还与OS等有关。比如windows下默认的用户态内存空间为2GB,也就意味着就算系统有2GB以上的虚拟内存,程序员也只能获得<2GB的Heap空间。ps:貌似没有链表一定是不连续的说法,链表的内存空间也有可能连续,只是链表不要求内存是连续的,是否连续对链表来说没有影响。 1.对于用寄存器传递返回值的系统来说,主调函数的下一条指令地址是最先进栈的。但对于用stack传递返回值的系统来说,返回值是最先进栈的。
2.栈顶指针指向主调函数中下一条指令的地址并不会让程序由该点继续运行,而是要将该地址出栈,送入(E)IP寄存器中。 一个字节显然是不够存放heap的大小的。 这段代码对比的显然不是内存IO的速度,而只是寻址的效率问题。
如果把上面的代码char *p ="1234567890";改为char *p=c;显然p所指向的内存也是在stack中的。按照楼主的说法,修改后对p[1]的访问就会变快。但显然修改后对p[1]的寻址方式和修改前是一样的,也就是说对p[1]的访问速度是不变的。
[ Last edited by magic7004 on 2010-6-2 at 09:11 ] |