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++写的)

  • 相关阅读:
    PCL中分割_欧式分割(1)
    如何在ROS中使用PCL(2)
    PCL超体聚类
    PCL常见错误集锦
    cv_bridge中的编码模式与实现
    Centos 安装配置gerrit
    git merge git pull时候遇到冲突解决办法git stash
    Python 虚拟环境:Virtualenv
    配置gitlab gerrit jenkins
    selinux开启关闭
  • 原文地址:https://www.cnblogs.com/chaeyeon/p/6144434.html
Copyright © 2011-2022 走看看