精华内容
下载资源
问答
  • javascript的变量和C、java相去甚远,按照《画家与黑客》的说法,弱类型的变量是强大语言的基础;...ECMAScript变量包括类型:基本类型和引用类型 基本类型是指简单的数据段(Undefined、Nul...

    javascript的变量和C、java相去甚远,按照《画家与黑客》的说法,弱类型的变量是强大语言的基础;作用域与其他语言类似,但没有块级作用域;内存管理就要靠大学学的操作系统那门课的基础了;看来当时学的时候不知道有什么用,没准到哪天就豁然开朗了,所以知识储备还是必不可少的。

    变量

    ECMAScript变量包括两种类型:基本类型和引用类型

    基本类型是指简单的数据段(Undefined、Null、Boolean、Number、String),引用类型是指那些可能由多个值构成的对象(Object)。

    这两种类型的区别是:基本类型操作的是保存在变量中的实际的值,在传递参数或复制变量的时候,直接把变量值传递给参数。而引用类型的值是保存在内存中的对象,传递参数或复制变量时传递的是指针。

    String类型在其他语言中一般被当做对象,而在Javascript中是基本类型。

    ECMAScript中传递参数的时候要注意引用的传递,实际上是把指针的内容传递给参数。参数指针变化时,不影响原引用。参数操作指向的内容时,原引用同步变化。

    function setName(obj){
        obj.name="JavaScript";
        obj = new Object();    //参数的内容发生变化
        obj.name="React";
        
    }
    
    var person=new Object();
    setName(person);
    console.log(person.name);  //返回JavaScript/

     

    实际上Java语言也是如此处理的:

    public class JavaArguments{
    
        public static void main(String[] args){
            StringBuffer temp = new StringBuffer();
            temp.append("hello");
    
            test(temp);
            System.out.println(temp.toString());  //返回java
        }
    
        public static void test(StringBuffer sb){
            sb.append(" java");
            sb=new StringBuffer();
            sb.append("new StringBuffer");
        }
    }

     

    变量类型的检测可以是用typeof操作符,但是对于引用类型,只能返回object字符串,如果想知道对象的类型,则需要instanceof操作符,正确则返回true,否则返回false。

    console.log(person instanceof Object);
    console.log(person instanceof Array);
    console.log(person instanceof RegExp);

     

    执行环境及作用域

     执行环境(execution context)是JavaScript中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象(variable object)。

    全局执行环境是最外围的一个执行环境。根据宿主环境不同,表示执行环境的对象也不一样。在Web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都作为window对象的属性和方法创建的。

    某个执行环境中所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁(全局执行环境知道应用程序退出--例如关闭网页或浏览器--时才被销毁)。

    每一个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在环境执行后,栈将其环境弹出,把控制权返还给之前的执行环境。

    当代码在环境中执行时,会创建变量对象的一个作用域链(scope chain)。自身所在环境的变量对象是链条的前端,末端始终是全局环境的变量对象。如果一直找不到标识符,则会发生错误。

    var color="blue";
    function changeColor(){
        var anotherColor = "red";
    
        function swapColors(){
            var tempColor = anotherColor;
            anotherColor = color;
            color = tempColor;
            console.log("--------- 1-----------------")
            console.log(color);               //red
            console.log(anotherColor);  //blue
            console.log(tempColor);      //red
        }
    
        swapColors();
        console.log("--------- 2-----------------")
        console.log(color);                     //red
        console.log(anotherColor);        //blue
        //console.log(tempColor);          //undefined错误
    }
    
    
    changeColor();
    console.log("--------- 3-----------------")
    console.log(color);                        //red
    //console.log(anotherColor);         //undefined错误
    //console.log(tempColor);             //undefined错误
    作用域链

    with语句实际上就是指定了作用域链的前端。

     JavaScript中没有块级作用域,所以for语句中声明的变量,在块的外部一样能够访问。

    垃圾回收

     JavaScript具有自动垃圾回收机制

    针对局部变量,局部变量只在函数执行的过程中存在,在栈(或堆)的顶部分配相应的空间,存储它们的值,函数执行结束后,变量也就没用了,此时即可释放内存。

    判断变量是否有用的策略可能会因实现而异。

    具体到浏览器,通常采用标记清除(mark-and-sweep)策略。

    垃圾收集器在运行时会给存储在内存中的所有变量都加上标记,然后他会去掉环境中的变量以及被环境的变量引用的变量的标记。至此仍然有标记的变量将被视为准备删除的变量,因为环境中的变量已经无法访问到这些变量了。最后垃圾收集器完成内存清除工作。销毁那些带标志的值并回收他们所占用的内存空间。

    作为开发人员,我们能够做的,是在全局变量和全局对象不再使用后,将其值设置位null来释放引用。这个做法叫做 解除引用(dereferencing)。

    小结

     JavaScript变量可以用来保存两种类型的值:基本类型值(Undefined、Null、Boolean、Number和String)和引用类型值。特点如下:

    • 基本类型值在内存中占据固定大小的空间,因此被保存在栈空间中。
    • 从一个变量向另一个变脸复制基本类型的值,会创建这个值的副本。
    • 引用类型的值是对象,保存在堆内存中。
    • 包含引用类型值的变量实际上包含的并不是对象本身,而是指向该对象的指针。
    • 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。
    • 可以用typeof来判断一个值哪种基本类型,而确定一个值是哪种引用类型可以使用instanceof操作符。

    关于执行环境:

    • 执行环境有全局执行环境和函数执行环境之分。
    • 每次进入一个新的执行环境,都会创建一会用于搜索变量和函数的作用域链。
    • 函数的局部环境不仅有全访问函数作用域中的变量,而且有圈访问其包含环境,乃至全局环境。
    • 全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据。
    • 变量的执行环境有助于确定应该何时释放内存。

    关于内存管理:

    • 离开作用域的值将被标记位可回收,因此将在垃圾收集期间被删除。
    • “标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存。
    • 接触变量的引用不仅有助于消除循环引用现象,而且对垃圾收集也有好处。为了确保有效地回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。

     

     

     

     

    变量

     

    变量

     

    转载于:https://www.cnblogs.com/liangflying521/p/5088174.html

    展开全文
  • IO端口和IO内存详解

    2013-05-15 15:18:40
    外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...
  • 内存映射与端口映射

    千次阅读 2015-12-14 08:42:30
    外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped,也称...

    一、概念理解

       几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped,也称“端口映射”),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。
       有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以像访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。
       而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独的地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个与CPU的RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。


    二、展开

    (本段参考derennet的文章设备地址与I/O内存映射

       在嵌入式编程中,绝大部分功能都是通过驱动外设实现的,这些外设不仅可以是CPU外部的某种功能模块,也可以是CPU芯片内部集成的某些器件。这些芯片内部的外设基本都是通过总线的方式与CPU核心相连,而对它们的控制也通过对这些总线上的外设寄存器的配置来实现。
       外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
       但是外设寄存器与CPU核心寄存器不同,核心寄存器是有名字的,不同体系架构的寄存器名也不一样,这个体现在不同架构的编译器里;而外设寄存器是有地址的,不同CPU芯片会有不同总线连接方式,所以也会有不同的外设寄存器地址,有了地址以后,CPU核心寄存器就可以通过相应的外设寄存器地址去配置相应设备的动作了。

       CPU对外设IO端口物理地址的编址方式 有两种:

       一种是I/O映射方式(I/O-mapped)称为端口映射,另一种是存储空间映射方式(Memory-mapped),称为内存映射。具体采用哪一种取决于CPU的体系结构。
       端口映射的典型代表是MCS-51系列单片机和x86体系,这种映射需要有独立的地址空间对应外设地址,而且还需要另外的汇编命令来控制。如51单片机的sfr特殊功能寄存器就是一个特别的命令来控制外设,而sfr所管理的128B的地址也是与RAM地址独立的,有兴趣的同学可以搜索下sfr的相关介绍。
       内存映射是嵌入式设备体系用的比较多的方式,我们熟知的ARM体系,PowerPC就是用了这种与物理RAM地址统一编址的方式。
       如STM32里对各种外设寄存器的操作就使用了简单的指针方式:
          #define rGPACON (*(volatile unsigned *)0x7F008000)    //Port Acontrol
       相应的外设寄存器地址可以通过芯片的datasheet找到。下图是s3c6410 datasheet的截图

    https://img-blog.csdn.net/20140213151954218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamllYmFvYWJjYWJj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

    通过指针配置外设得到的方便,在STM32的编程中你完全可以体会到它的便利。但是这仅仅是在裸机程序上,到操作系统层面上,原本简单的东西也会变得复杂。。。







    展开全文
  • IO端口和IO内存

    2013-09-17 14:53:43
    外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...

    A.几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/Omapped),另一种是内存映射方式(Memorymapped)。而具体采用哪一种则取决于CPU的体系结构。

      有些体系结构的CPU(如,PowerPCm68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的内存映射方式Memorymapped)。

      而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间或者“I/O端口空间。这是一个与CPURAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86INOUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式I/Omapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPUI/O空间就只有64KB00xffff)。这是“I/O映射方式的一个主要缺点。

      Linux将基于I/O映射方式的或内存映射方式的I/O端口通称为“I/O区域I/O region)。在讨论对I/O区域的管理之前,我们首先来分析一下Linux是如何实现“I/O资源这一抽象概念的.

    B.

    在驱动程序编写过程中,很少会注意到IO PortIO Mem的区别。虽然使用一些不符合规范的代码可以达到最终目的,这是极其不推荐使用的。

    结合下图,我们彻底讲述IO端口和IO内存以及内存之间的关系。主存16M字节的SDRAM,外设是个视频采集卡,上面有16M字节的SDRAM作为缓冲区。

    1.         CPUi386架构的情况

    i386系列的处理中,内存和外部IO是独立编址,也是独立寻址的。MEM的内存空间是32位可以寻址到4GIO空间是16位可以寻址到64K

    Linux内核中,访问外设上的IO Port必须通过IO Port的寻址方式。而访问IO Mem就比较罗嗦,外部MEM不能和主存一样访问,虽然大小上不相上下,可是外部MEM是没有在系统中注册的。访问外部IO MEM必须通过remap映射到内核的MEM空间后才能访问。

    为了达到接口的同一性,内核提供了IO PortIO Mem的映射函数。映射后IO Port就可以看作是IO Mem,按照IO Mem的访问方式即可。

    2.         CPUARM PPC架构的情况

    在这一类的嵌入式处理器中,IO Port的寻址方式是采用内存映射,也就是IO bus就是Mem bus。系统的寻址能力如果是32位,IO PortMem(包括IO Mem)可以达到4G

    访问这类IO Port时,我们也可以用IO Port专用寻址方式。至于在对IO Port寻址时,内核是具体如何完成的,这个在内核移植时就已经完成。在这种架构的处理器中,仍然保持对IO Port的支持,完全是i386架构遗留下来的问题,在此不多讨论。而访问IO Mem的方式和i386一致。

     

    注意linux内核给我提供了完全对IO PortIO Mem的支持,然而具体去看看driver目录下的驱动程序,很少按照这个规范去组织IO PortIO Mem资源。对这二者访问最关键问题就是地址的定位,在C语言中,使用volatile 就可以实现。很多的代码访问IO Port中的寄存器时,就使用volatile关键字,虽然功能可以实现,我们还是不推荐使用。就像最简单的延时莫过于while,可是在多任务的系统中是坚决避免的!

    展开全文
  • I/O映射和内存映射

    千次阅读 2017-06-24 11:03:10
    外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...

    几乎每一种外设都是通过读写设备上的寄存器来进行的。外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。而具体采用哪一种则取决于CPU的体系结构。


    有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。这就是所谓的“内存映射方式”(Memory-mapped)。


    而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。这是一个与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。这就是所谓的“I/O映射方式”(I/O-mapped)。与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86CPU的I/O空间就只有64KB(0-0xffff)。这是“I/O映射方式”的一个主要缺点。
    ===========================================
    以上描述中“外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分”应该如何理解?
    这个I/O端口被映射到内存后,是在内存中有一个I/O端口的“镜像”吗(就是说I/O本身的寄存器地址和映射到内存后的端口地址是分开的,只是关系上存在一个对应而已)?还是说I/O端口本身和物理内存一起被编码为连续的“CPU识别的地址”(即CPU将物理内存编码后接着将I/O地址也跟着编码,内存地址和I/O地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。)
    以上两种理解哪种才是正确的?
    另外我想问一下这个“CPU的单一物理地址空间”包括哪些对象,仅仅是物理Memory(RAM\ROM\FLASH)对象吗?是不是一个逻辑上的概念?

     

     

    回答:外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分

    就是说端口可以用访问内存的方式操纵,比如mov指令,可以把数据直接传送到那个端口

    I/O端口本身和物理内存一起被编码为连续的“CPU识别的地址”(即CPU将物理内存编码后接着将I/O地址也跟着编码,内存地址和I/O地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。)
    这个解释差不多吧


    展开全文
  • IO端口和IO内存映射

    千次阅读 2012-10-16 08:52:52
    外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...
  • C++11 中智能指针包括以下三种: 共享指针(shared_ptr):资源可以被多个指针共享,使用计数机制表明资源被几个指针共享。通过 use_count() 查看资源的所有者的个数,可以通过 unique_ptr、weak_ptr 来构造,调用 ...
  • 通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一内存映射方式(Memory-...
  • 外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...
  • 外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...
  • 外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...
  • 腾讯云服务器标准型实例包括很多不同机型的型号。本文主要说S2实例、sa1实例和sa2实例。这款实例都是腾讯云页面比较常见的机型。这样对于新用户就容易产生困扰,不知道该选择哪个。下面详细说说在腾讯云常看到的...
  •  所谓资源就是,一旦用了它,将来必须还给系统。如果不这样,糟糕的事情就会发生。  C++程序中最常使用的资源就是动态分配内存(如果你分配内存却从来不曾归还它,会导致内存泄露), ... 不论资源,最重要...
  • 一、单元测试的任务有哪些? 单元测试的主要任务包括对单元功能、逻辑控制、数据和安全性等各方面进行必要的...你认为比较好,理由是什么? 1、代码互查 2、代码走查。 2、正式会议审查 我认为正式会议审...
  • 所谓资源管理就是,一旦用了它,将来必须还给操作系统....不论是资源,重要的是,当你不再使用它你就要将它返回给系统. 条款13:以对象管理资源 举个例子一个大型的项目里面的代码都是成...
  • ActiveMQ的常见的消息持久化机制包括JDBC、AMQ、KahaDB、LevelDB,无论使用哪种持久化方式,消息的存储逻辑都是一致的。 在发送者将消息发送出去后,消息中心首先将消息存储到本地数据文件、内存数据库或远程数据库...
  • 无论是资源,我们都要确保当自己使用完之后还给系统。 条款13:以对象管理资源 1. 资源并没有还给系统。 概述中已经说到,资源用完之后要还给系统。 我们考虑以下函数会发生什么: void f()...
  • o输入提示选择哪种算法,例如:输入“0”--HPF,输入“1”--RR; ) 输入提示创建进程的个数,初始化进程; PCB内容:进程名/PID 运行时间 优先权 状态 PCB指针 ●运行过程中须提示所创建进程的状态信息,包括:已...
  • OllyDBG v1.10 汉化第

    热门讨论 2011-05-19 23:11:43
    因此您就能了解代码的一部分被频繁执行。 补丁: 内置汇编器能够自动找到修改过的代码段。二进制编辑器则会以ASCII、UNICODE或者十六进制的形式同步显示修改后的数据。修改后的数据同其它数据一样,能够进行复制-...
  • 其中硬件包括哪几部分?软件包括哪几部分?各部分的功能如何?1、由硬件系统和软件系统组成。2、硬件包括①中央处理器,②存储器:内存存储器分为随机读/写存储器(RAM)、只读存储器(ROM)和高速缓冲存储器类。...
  • 01、计算机基础

    2020-07-16 22:52:27
    一、计算机基础 : 什么是硬件:是指组成计算机的所有...计算机语言包括哪三种:机器语言、汇编语言、高级语言 代码语法逻辑运行错误包括:语法错误、逻辑错误、运行错误 调试(bug)是什么:是发现和减少计算机程序中
  • 计算机配置

    2012-08-03 15:39:00
    内存的存取速度取决于接口、颗粒数量多少与储存大小(包括内存的接口,如:SDRAM133,DDR333,DDR2-533,DDR2-800,DDR3-1333),一般来说,内存越大,处理数据能力越强,而处理数据的速度主要看内存属于哪种类型...
  • Java对象的生命周期

    2021-03-20 11:01:12
    java对象的生命周期包括 创建、使用、回收 个过程,本文将详细剖析每个过程。 一、对象的创建 当运行时执行代码遇到new指令、反序列化、反射、克隆时会创建新的对象。创建对象的过程如下图: java虚拟机...
  • 对于一个应用程序来讲,哪种优化策略能达到最好的性能取决于该应用程序的性能瓶颈在;比如说,对一段性能瓶颈在内存访问的代码进行指令使用方面的优化将不会得到很好的优化效果。所以,在性能优化之...
  • CPU对外设IO端口物理地址的编程方式

    千次阅读 2017-09-04 13:05:08
    外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器大类,而且一个外设的寄存器通常被连续地编址。CPU对外设IO端口物理地址的编址方式有两:一是I/O映射方式(I/O-mapped),另一...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 212
精华内容 84
关键字:

内存包括哪三种