内存类型

指针

旧巷老猫 提交于 2019-12-26 18:20:53
前言 这不是我第一次写关于C指针的文章了,只是因为指针对于C来说太重要,而且随着自己编程经历越多,对指针的理解越多,因此有了本文。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以我想通过一篇文章来尽可能的讲解指针,以对得起这个文章的标题吧。 为什么需要指针? 指针解决了一些编程中基本的问题。 第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果, 但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能。但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。 第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。 第三,有些操作必须使用指针。如操作申请的堆内存。还有: C语言中的一切函数调用中,值传递都是“按值传递(pass by value)”的,如果我们要在函数中修改被传递过来的对象,就必须通过这个对象的指针来完成。 指针是什么? 我们指知道:C语言中的数组是指 一类 类型,数组具体区分为 int 类型数组,double类型数组,char数组 等等。同样指针 这个概念也泛指 一类 数据类型,int指针类型,double指针类型,char指针类型等等。

一个Java对象到底占多少内存

与世无争的帅哥 提交于 2019-12-26 16:15:05
内存是程序员逃不开的话题,当然Java因为有GC使得我们不用手动申请和释放内存,但是了解Java内存分配是做内存优化的基础,如果不了解Java内存分配的知识,可能会带偏我们内存优化的方向。所以这篇文章我们以“一个对象占多少内存”为引子来谈谈Java内存分配。 文章基于JDK版本:1.8.0_191 文章标题提出的问题是”一个对象到底占多少内存“,看似很简单,但想说清楚并不容易,希望本文的探讨能让你有收获。 在开始之前我还是决定先提一个曾经阴魂不散,困扰我很久的问题,了解这个问题的答案有助于我们理解接下来的内容。 Java虚拟机如何在运行时知道每一块内存存储数据的类型的? 我们知道Java中int占4个字节,short占2个字节,引用类型在64位机器上占4个字节(不开启指针压缩是8个字节,指针压缩是默认开启的),那JVM如何在运行时知道某一块内存存的值的类型是int还是short或者其他基础类型,亦或者是引用的地址?比如以int为例,4个字节只够存储int数据本身,并没有多余的空间存储数据的类型! 想解答这个问题,需要从字节码入手,还需要我们了解一些Java虚拟机规范的知识, 来看一个简单的例子 public class Apple extends Fruit{ private int color; private String name; private Apple brother

new与make的区别

 ̄綄美尐妖づ 提交于 2019-12-26 10:24:27
1.二者都是用来做内存分配的。 2.make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身; 3.而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。 func main() { a := new(int) b := new(bool) fmt.Printf("%T\n", a) // *int fmt.Printf("%T\n", b) // *bool fmt.Println(*a) // 0 fmt.Println(*b) // false } 来源: CSDN 作者: qq_36115340 链接: https://blog.csdn.net/qq_36115340/article/details/103706606

Equals 和 == 的区别--转

懵懂的女人 提交于 2019-12-25 06:53:24
在比较Equals 和 ==的区别前。我们先来了解下相关的知识 C#数据类型 1、值类型 值类型有:   值类型包括:简单类型、结构类型、枚举类型。   byte(1)、sbyte(1)、short(2)、ushort(2)、int(4)、uint(4)、long(8)、ulong(8)、float(4)、double(8)、decimal(8)、char、bool、枚举、结构。   上述中括号中的数字表示字节数,byte、ushort、uint、ulong 为无符号类型(没有负数),顺便说一下 sbyte 是有符号的字节。 2、引用类型   引用类型有:对象(Object)类型、类类型、接口、代表元、字符串类型、数组。 new 运算符 在 C# 中, new 关键字可用作运算符、修饰符或约束。 1、 new 运算符   用于创建对象和调用构造函数。 2、new 修饰符   用于向基类成员隐藏继承成员。 3、new 约束   用于在泛型声明中约束可能用作类型参数的参数的类型。 需注意一点:凡是用new运算符就会在堆内存中开辟空间存放引用(引用地址存放在栈上)对象的值 == 和 Equals 的区别   1. == 是一个运算符。   2.Equals则是string对象的方法,可以.(点)出来。 我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较 1、基本数据类型比较

Go语言学习笔记

二次信任 提交于 2019-12-25 01:05:20
Go 语言数据类型 Go 语言按类别有以下几种数据类型: 序号 类型和描述 1 布尔型 布尔型的值只可以是常量 true 或者 false。一个简单的例子:var b bool = true。 2 数字类型 整型 int 和浮点型 float,Go 语言支持整型和浮点型数字,并且原生支持复数,其中位的运算采用补码。 3 字符串类型: 字符串就是一串固定长度的字符连接起来的字符序列。Go的字符串是由单个字节连接起来的。Go语言的字符串的字节使用UTF-8编码标识Unicode文本。 4 派生类型: 包括: (a) 指针类型(Pointer) (b) 数组类型 (c) 结构化类型(struct) (d) 联合体类型 (union) (e) 函数类型 (f) 切片类型 (g) 接口类型(interface) (h) Map 类型 (i) Channel 类型 数字类型 Go 也有基于架构的类型,例如:int、uint 和 uintptr。 序号 类型和描述 1 uint8 无符号 8 位整型 (0 到 255) 2 uint16 无符号 16 位整型 (0 到 65535) 3 uint32 无符号 32 位整型 (0 到 4294967295) 4 uint64 无符号 64 位整型 (0 到 18446744073709551615) 5 int8 有符号 8 位整型 (-128 到

delphi指针

元气小坏坏 提交于 2019-12-23 22:24:25
delphi中由于vcl的存在,于是指针很少用到。昨天和“贱男”(一个做sp的朋友)在讨论一个多线程的问题,最后考虑是不是指针传递的错误。 要求是这样的:sql的数据库,程序中的主线程以sql查询获取二十条记录,然后传递给子线程,主线程挂起。while ....not语句,一条条赋给子线程,每子线程存一条记录,以指针传递的(pchar).应用华为的api(vc编写)其中LPCSTR用delphi 中pchar代替,但是最后子线程得到的数据是乱七八遭的东西。不从数据库读取数据,读字符串和变量都是正确的,实在不解?是不是指针传递数据时候出错? 顺便放出pascal的指针: 浅谈Object Pascal的指针 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人 产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今 的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。 以下内容分为八个部分,分别是 一、类型指针的定义 二、无类型指针的定义 三、指针的解除引用 四、取地址(指针赋值) 五、指针运算 六、动态内存分配 七、字符数组的运算 八、函数指针 一、类型指针的定义

delphi指针

人走茶凉 提交于 2019-12-23 10:42:35
浅谈Object Pascal的指针 大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是C语言的灵魂,一点都不为过。同时,这种说法也让很多人 产生误解,似乎只有C语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal语言本身也是支持指针的。从最初的Pascal发展至今 的Object Pascal,可以说在指针运用上,丝毫不会逊色于C语言的指针。 以下内容分为八个部分,分别是 一、类型指针的定义 二、无类型指针的定义 三、指针的解除引用 四、取地址(指针赋值) 五、指针运算 六、动态内存分配 七、字符数组的运算 八、函数指针 一、类型指针的定义。对于指向特定类型的指针,在C中是这样定义的: int *ptr; char *ptr; 与之等价的Object Pascal是如何定义的呢? var ptr : ^Integer; ptr : ^char; 其实也就是符号的差别而已。 二、无类型指针的定义。C中有void *类型,也就是可以指向任何类型数据的指针。Object Pascal为其定义了一个专门的类型:Pointer。于是, ptr : Pointer; 就与C中的 void *ptr; 等价了。 三、指针的解除引用。要解除指针引用(即取出指针所指区域的值),C 的语法是 (*ptr),Object Pascal则是

关系型和非关系型数据库的区别?

佐手、 提交于 2019-12-22 21:29:01
当前主流的关系型 数据库 有 Oracle 、DB2、Microsoft SQL Server、Microsoft Access、 MySQL 等。 非关系型数据库有 NoSql、Cloudant。 nosql和关系型数据库比较? 优点: 1)成本:nosql数据库简单易部署,基本都是开源软件,不需要像使用oracle那样花费大量成本购买使用,相比关系型数据库价格便宜。 2)查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据库。 3)存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,所以可以存储基础类型以及对象或者是集合等各种格式,而数据库则只支持基础类型。 4)扩展性:关系型数据库有类似join这样的多表查询机制的限制导致扩展很艰难。 缺点: 1)维护的工具和资料有限,因为nosql是属于新的技术,不能和关系型数据库10几年的技术同日而语。 2)不提供对sql的支持,如果不支持sql这样的工业标准,将产生一定用户的学习和使用成本。 3)不提供关系型数据库对事物的处理。 非关系型数据库的优势:1. 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。2. 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展

JAVA虚拟机JVM的简单认识

泪湿孤枕 提交于 2019-12-22 16:58:02
以前面试的时候经常会被问到Java虚拟机的问题,面试官会问到: ------------你知道虚拟机吗? ------------虚拟机内存机构是什么样的? ------------栈区和堆区的区别你知道吗? ------------虚拟机的类加载机制你知道吗? ------------虚拟机的双亲委派机制你知道吗? ------------java虚拟机的垃圾回收你知道吗? ------------JVM的优化你知道吗?内存优化你知道吗? 等等。。。。。。。。。。不知道!。。。。好,那就先这样吧,我们会过两天通知你面试结果,先回家等着吧。就这样等到了天荒地老,也没有等到面试的结果和通知。 如果你看完这篇文章还不了解虚拟机,面试的时候还被虚拟机的问题问住,我只能说,你没有认真看。 以上内容纯属废话,请看下面: -------------------------------------------------------------------------------------------- 一、java虚拟机的认知 1、JVM是Java Virtual Machine(Java虚拟机)的缩写。 虚拟机,字面理解就是虚拟的计算机。计算机可以安装操作系统吧,所以这个虚拟的计算机里面亦可以安装操作系统,比如Windows、Linux。就可理解成,虚拟机就是一款软件

java内存划分

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-21 09:10:13
运行时数据区域 Java虚拟机在执行Java的过程中会把管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,而有的区域则依赖线程的启动和结束而创建和销毁。 Java虚拟机包括下面几个运行时数据区域: 程序计数器 程序计数器是一块较小的区域,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的模型里,字节码指示器就是通过改变程序计数器的值来指定下一条需要执行的指令。分支,循环等基础功能就是依赖程序计数器来完成的。 由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间来完成,一个处理器同一时间只会执行一条线程中的指令。为了线程恢复后能够恢复正确的执行位置,每条线程都需要一个独立的程序计数器,以确保线程之间互不影响。 所以程序计数器是“线程私有”的内存。 如果虚拟机正在执行的是一个Java方法,则计数器指定的是字节码指令对应的地址,如果正在执行的是一个本地方法,则计数器指定问空undefined。 程序计数器区域是Java虚拟机中唯一没有定义OutOfMemory异常的区域。 Java虚拟机栈 和程序计数器一样也是线程私有的,生命周期与线程相同。 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息