您好,登录后才能下订单哦!
一个由C/C++编译的程序占用的内存分为以下几个部分
例如:
#include "stdio.h"
int a = 0;//全局初始化区 
char *p1;//   全局未初始化区    
void main(void)    
{    
        int       b;                  // 栈    
        char   s[]  =  "abc"; // 栈    
        char   *p2;              // 栈    
        char   *p3   =   "123456"; //   123456/0在常量区,p3在栈上。    
        static int   c   =0;//   全局(静态)初始化区    
        p1   =   (char   *)malloc(10);    
        p2   =   (char   *)malloc(20);    
        //分配得来得10和20字节的区域就在堆区。    
        strcpy(p1,   "123456"); //   123456/0放在常量区,编译器可能会将它与 
        //p3所指向的"123456" 优化成一个地方。       
}
stack:
由系统自动分配。 
例如,声明在函数中一个局部变量 int b;  系统自动在栈中为b开辟空 间
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢 出。
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有 的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将 提示overflow。因此,能从栈获得的空间较小。
存取效率的比较
char  s1[] = "aaaaaaaaaaaaaaa";
char *s2  = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa 是在运行时刻赋值的;
而 bbbbbbbbbbb 是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 
例如:
#include "stdio.h" 
void main(void) 
{
    char    a    =   1; 
    char    c[]   =   "1234567890";
    char   *p    =   "1234567890";
    a    =   c[1];
    a   =   p[1];
    return;
}
对应的汇编代码    
10:   a   =   c[1];    
  00401067   8A   4D   F1    mov   cl,byte   ptr   [ebp-0Fh]    
  0040106A   88   4D   FC   mov   byte   ptr   [ebp-4],cl    
11:   a   =   p[1];    
  0040106D   8B   55   EC   mov   edx,dword   ptr   [ebp-14h]    
  00401070   8A   42   01     mov   al,byte   ptr   [edx+1]    
  00401073   88   45   FC     mov   byte   ptr   [ebp-4],al 
第一种在读取时直接就把字符串中的元素读到寄存器cl中,
第二种则要先把指针值读到 edx中,再根据edx读取字符,显然慢了。


免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。