内存类型

C++基础知识

给你一囗甜甜゛ 提交于 2020-01-23 13:08:01
C++ 基础知识 知识点 列号 说明 1 引言 2 函数与参数 3 异常 4 动态存储空间分配 5 自有数据类型 6 异常类illegalParameterValue 引言 在检查一个程序的时候,我们应该提出如下疑问: 它正确吗? 它容易读懂吗? 它有完善的文档吗? 它容易修改吗? 它在运行时需要多大内存? 它的运行时间有多长? 它的通用性如何?能否不加修改就可以解决更大范围的数据? 它可以直接在多种计算机上编译和运行吗?或者说它需要修改之后才能运行吗? 函数与参数 参数的传递方式一:值传递 程序1-1 求两个整数的和 int sum(int a, int b) { return a + b; } 在上述的函数sum中,a,b就是函数sum的形参(formal parameter),每一个形参都是整型的,如果有这样的调用: z = sum(1,2) 那么,1和2变身分别的对应sum的a和b的实参(actual parameter) 在上述的1-1程序中,形参a和b实际上是传值参数(value parameter)。在运行时,函数sum执行前,把实参复制给形参。复制过程是由形参类型的复制构造函数(copy construstor)来完成的。如果实参和形参的类型不同,必须进行类型转换,把实参转换为形参的类型,当然,前提是这样的类型转换是被允许的。 当调用sum(1,2)时

数据类型在内存中的存储

喜欢而已 提交于 2020-01-22 16:43:57
数据类型在内存中的存储 (一)类型的基本归类 (1)整形家族 char、int、short、long、long long、unsigned int等 (2)浮点型家族 (3)构造类型:数组、结构体、枚举、联合 (4)指针类型 (5)空类型:void 表示空类型(无类型),通常应用于函数的返回类型、函数的参数(不需要参数)、指针类型 整形的存储: 一个变量的创建是要在内存中开辟空间的,空间的大小根据不同的类型来决定 整形家族:存储是使用二进制 (原码,反码,补码) 内存中存储的是补码,原因:使用补码,可以将符号位和数值域统一处理,同时加法和减法也可以同时处理(CPU中只有加法器),此外,补码与原码相互转换,其运算过程是相通的,不需要额外的通行电路。 #include<stdio.h> int main() { char a=-1; signed char b=-1; unsigned char c=-1; printf("a=%d,b=%d,c=%d",a,b,c); return 0; } 这里会输出什么呢? a=-1,b=-1,c=255 原因是: 在计算机中以补码存储 a,b都是有符号字符类型,在计算机中的补码为”11111111“, 当以”%d“的形式输出时,因为之前的字符类型有符号,所以转换成整形之后,仍然有符号,即

Java的内存分配机制

笑着哭i 提交于 2020-01-22 16:43:15
Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可 见JVM的重要性。所以在学习Java内存分配原理的时候一定要牢记这一切都是在JVM中进行的,JVM是内存分配原理的基础与前提。 一个完整的Java程序运行过程会涉及以下内存区域: 寄存器: JVM内部虚拟寄存器,存取速度非常快,程序不可控制。 栈: 保存局部变量的值,包括:a.用来保存基本数据类型的值;b.保存类的 实例 ,即堆区 对象 的引用(指针)。也可以用来保存加载方法时的帧。 堆: 用来存放动态产生的数据,比如new出来的 对象 。注意创建出来的对象只包含属于各自的成员变量,并不包括成员方法。因为同一个类的对象拥有各自的成员变量,存储在各自的堆中,但是他们共享该类的方法,并不是每创建一个对象就把成员方法复制一次。 常量池: JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合。包括直接常量(基本类型,String)和对其他类型、方法、字段的 符号引用(1) 。池中的数据和数组一样通过索引访问。由于常量池包含了一个类型所有的对其他类型、方法、字段的符号引用,所以常量池在Java的动态链接中起了核心作用。 常量池存在于堆中 。 代码段: 用来存放从硬盘上读取的源程序代码

浅谈深拷贝与浅拷贝

浪尽此生 提交于 2020-01-22 08:32:18
浅谈浅拷贝与深拷贝 浅拷贝 一 、不可变类型(字符串、数字、元组) copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。 import copy # 不可变类型: 数字 、字符串、 元组 a1 = "abc" b1 = copy.copy(a1) # 查看内存地址 print(a1, id(a1)) print(b1, id(b1)) # 内存地址相同 abc 2189271452784 print("=" * 30) a2 = 123 b2 = copy.copy(a2) # 查看内存地址 print(a2, id(a2)) print(b2, id(b2)) # 内存地址相同 123 1823767392 print("=" * 30) a3 = (123, "abc", [1, 2]) b3 = copy.copy(a3) # 查看内存地址 print(a3, id(a3)) print(b3, id(b3)) # 内存地址相同 2234778896712 print("=" * 30) # 查看子对象内存地址 print(a3[1], id(a3[1])) print(b3[1], id(b3[1])) # 内存地址相同 abc 2923810278512 print("="*30) print(a3[2]

Javascript基础

荒凉一梦 提交于 2020-01-22 04:46:27
变量 作用: 用来保存值 保存两种类型的值: 基本类型值,和引用类型值; 访问方式: 按值访问 和 按引用访问 操作方式: 直接操作保存在变量中的实际的值。 引用类型的值是保存在内存中的对象,不能直接操作对象的内存空间。实际上是在操作对象的引用而不是实际的对象。 数据类型 两大类 8 种数据类型 最新的 ECMAScript 标准定义了 8 种数据类型: 参考 MDN javascript 数据类型和数据结构 七种原始类型 – 简单数据类型 Boolean Null Null 类型只有一个值就是null值 Undefined Undefined类型只有一个值就是undefined值 Number BigInt String Symbol 和 Object – 复杂数据类型 ( ECMAScript 定义的对象中有两种属性:数据属性和访问器属性 来自 MDN) 原始值的定义 除 Object 以外的所有类型都是不可变的(值本身无法被改变)。例如: JavaScript中字符串是不可变的 (译注:如: JavaScript 中对字符串的操作一定返回了一个新字符串,原始字符串并没有被改变)。 我们称这些类型的值为“原始值”。 Javascript 操作符: 一元操作符 只能操作一个值的操作符是一元操作符。!(非) ++a --b ++前置和++后置共同点 所有编程语言都是一样的

C语言内存对齐和结构补齐

我只是一个虾纸丫 提交于 2020-01-21 00:15:25
首先我们先看看下面的C语言的结构体: [cpp] view plain copy typedef struct MemAlign { int a; char b[3]; int c; }MemAlign; 以上这个结构体占用内存多少空间呢?也许你会说,这个简单,计算每个类型的大小,将它们相加就行了,以32为平台为例,int类型占4字节,char占用1字节,所以:4 + 3 + 4 = 11,那么这个结构体一共占用11字节空间。好吧,那么我们就用实践来证明是否正确,我们用sizeof运算符来求出这个结构体占用内存空间大小,sizeof(MemAlign),出乎意料的是,结果居然为12?看来我们错了?当然不是,而是这个结构体被优化了,这个优化有个另外一个名字叫“对齐”,那么这个对齐到底做了什么样的优化呢,听我慢慢解释,再解释之前我们先看一个图,图如下: 相信学过汇编的朋友都很熟悉这张图,这张图就是CPU与内存如何进行数据交换的模型,其中,左边蓝色的方框是CPU,右边绿色的方框是内存,内存上面的0~3是内存地址。这里我们这张图是以32位CPU作为代表,我们都知道,32位CPU是以双字(DWORD)为单位进行数据传输的,也正因为这点,造成了另外一个问题,那么这个问题是什么呢?这个问题就是,既然32位CPU以双字进行数据传输,那么,如果我们的数据只有8位或16位数据的时候

jvm gc 线程

非 Y 不嫁゛ 提交于 2020-01-20 20:48:06
java虚拟机运行时数据区 方法区 ​ 属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 java虚拟机: ​ 线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储 局部变量表 、 操作数栈 、 动态链接 、 方法出口 等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。 StackOverflowError:线程请求的栈深度大于虚拟机所允许的深度。 OutOfMemoryError:如果虚拟机栈可以动态扩展,而扩展时无法申请到足够的内存。 本地方法栈 ​ 区别于 Java 虚拟机栈的是,Java 虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。也会有 StackOverflowError 和 OutOfMemoryError 异常。 java堆 ​ 对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组。内部会划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。可以位于物理上不连续的空间,但是逻辑上要连续。 程序计数器 内存空间小,线程私有

面试准备——python知识

两盒软妹~` 提交于 2020-01-20 04:25:04
1、range和xrange的用法和区别 在Python2中,range()与xrange()功能是一样的,多用于for循环。但是不同的是 range产生的是一个list对象,而xrange是一个生成器对象 。从性能上,xrange优于range。 因此要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间。 在python3中xrange()已经不存在了,range()就是xrange()。 2、可变对象和不可变对象 不可变对象,该对象所指向内存中的值不能被改变 当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 不可变变量性质的优点在于减少了重复的值对内存空间的占用。 可变对象,该对象所指向的内存中的值可以被改变 变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变。 Python中,数值类型(int和float),字符串str, 元组tuple 都是不可变类型。而列表list,字典dict,集合set都是可变类型。 在除了tuple的不可变变量中,只要两个变量的数据类型相同并且值也相等,那么这两个变量的地址也相同。 作为函数参数 对于python中的可变与不可变对象

非关系型数据库Redis

僤鯓⒐⒋嵵緔 提交于 2020-01-19 17:59:09
文章目录 非关系型数据库Redis 一、Redis简介 1.Redis简介 2.Redis是内存高速缓存数据库 3.Redis的特性 4.Redis持久化 5.Redis架构模式: 二、Redis安装与配置 1.Redis的安装与部署(Linux) 2.windows下Redis的安装 3.Redis的内置数据类型 4.Redis的应用场景 5.Redis内置指令: http://doc.redisfans.com/ 三、Redis编程 1.python实现redis数据库的连接操作 2.Redis字符串常用操作 案例:生成给用户发送的验证码,验证码限制3s内生成一次,3s内第二次则无法获取 3.Redis列表常用操作 案例:Redis做消息队列的应用 案例:限制IP一分钟访问次数不能超过60次 非关系型数据库Redis 一、Redis简介 Redis参考资料: Github 源码:https://github.com/antirez/redis Redis 官网:https://redis.io/ 1.Redis简介 NoSQL(NoSQL = Not Only SQL ) ,意为“不仅仅是SQL”,泛指非关系型的数据库。 NoSQL数据库的产生就是为了 解决大规模数据集合多重数据种类 带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储。 Redis(Remote

01------JS基础总结

夙愿已清 提交于 2020-01-19 12:50:59
数据类型 1.分类 基本(值)类型 Number: 任意数值 Srting: 任意字符串 Boolean: true/false undefined: undefined null: null 对象(引用)类型 Object: 任意对象 Function: 特别的对象(可以执行) Array: 特别对象(内部数据有序/数据下标) 2.判断 typeOf: 数值/字符串/布尔值/undefined/funtion instanceof: 判断对象的具体类型 ===: null/undefined 注意:typeOf不能区别:null和Object,Object和Array 3.相关问题 1).undefined和null的区别? undefined代表定义未赋值 null定义并赋值了,只是值为null var a console . log ( a ) // undefined a = null console . log ( a ) // null 2).什么时候给变量赋值为null? 初始赋值,表明将要赋值为对象 变量使用结束前,让对象成为垃圾对象(被垃圾回收器回收) // 开始 var b = null //初始时赋值为null,表明将要赋值为对象 b = { name : 'alice' } // 最后 b = null //将b赋值为null 让b指向的对象成为垃圾对象