zoukankan      html  css  js  c++  java
  • 面象对象与面象过程内存分区

    这部分内容极其重要
    离开内存分配谈语法机制都是在扯淡

    声明:禁止以任何形式的转载!!!

    一、面象过程:比如C语言(内存四区)
    图片
    1.堆与全局的区别:只要不手动释放在程序运行期间变量空间始终存在。
    但是全局区的变量不能由程序员释放,而堆中的空间可以通过free()函数释放。
    常量区中的对象不可变:比如
    char *p="hello world";
    p[0]='y';
    显然程序通过下标的方法去将"hello world"中的h改为y,显然这是对内存分配的无知,p这个变量在栈中,而"hello world"是一个字面常量,在常量区中,常量区中的空间是只读,不可以通过程序写入数据的。p这个指针变量只不过是保存
    "hello world"这个字符串在常量区的首地址。并没有在栈中开辟空间来存这个字符串。但是你可以:p[0]去读取'h'(可读)而:
    char p[20]="hello world";
    p[0]='y';
    这是可以的,因为p[20]表示在栈中开辟了一个数据来存这个字符串,栈中的空间是可修改的。
      二、面象对象:的虚拟机图片

    栈:在方法体中定义的变量都是在栈中,包括值类型与引用类型。在栈中的引类型,系统分配空间,这个可空间可以放任意合法的数据。而栈中的引用类型,它没有存放数据的空中,但是在栈中为引用类型分配一个保存对象的引用,这个栈中的引用只能放地址。

    堆:所有通过new调用构造方法就会在堆中开辟空间,前面说过,在栈中开辟的空间用于保存指向堆中对象的地址,那么堆中的对象就是用于存放数据的空间,系统为对象中堆中开辟存放数据的空间,这个对象包括成员字段和指向成员函数的函数指针(这是站在C语言的角度来看,毕竟高级与语的底层是C/C++)

    String s="hello world";//这个字符串同样在方法区的常量池中,常量池中的空间在程序运行期间是只读的,这就是为什么说字符串对象是不可变的。
    String s=new String("hello world");//图上说过,通过new和构造就会在堆上开辟空间,用来存这个字符串,此时,这个字符串是可变的,因为堆区空间的可读可写的。在面象对象的语言中也有结构其语法和类相类,但是最本质的区别的类是引用类型,而结构是值类型,结构不会在堆中开辟空间来存放成员,而是在栈中开辟一段连续的空间来存放(这是站在C的角度来看,但是C#也好,Java也好,底层,都是用C/C++写的)

  • 相关阅读:
    C++11中静态局部变量初始化的线程安全性
    213. 打家劫舍 II
    cas解决aba相关问题
    socket[可读可写异常]3种条件的发生
    linux信号处理 (信号产生 信号阻塞 信号集)
    vim set paste解决粘贴乱序乱码问题
    174. 地下城游戏
    208. 实现 Trie (前缀树) 和 面试题 17.13. 恢复空格
    Centos安装和卸载docker
    Go语言轻量级框架-Gin与入门小案例MySQL增删查改
  • 原文地址:https://www.cnblogs.com/chaeyeon/p/6144434.html
Copyright © 2011-2022 走看看