内存类型

C语言 08-数组

冷暖自知 提交于 2020-01-30 04:32:16
本文目录 地址 一、一维数组 二、二维数组   说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略。 为了让大家更好地学习和理解数组,我们先来认识一下内存中的"地址"。 地址   1.计算机中的内存是以字节为单位的存储空间。内存的每一个字节都有一个唯一的编号,这个编号就称为地址。凡存放在内存中的程序和数据都有一个地址,也就是说,一个函数也有自己的内存地址。   2.当定义一个变量时,系统就分配一个带有唯一地址的存储单元来存储这个变量。比如: char a = 'A'; // A的ASCII值为65 int b = 66; 在16bit编译器环境下,系统为a、b分别分配1个字节、2个字节的存储单元。变量存储单元的第一个字节的地址就是该变量的地址。 可以看出,变量a的地址是ffc3;变量b的地址是ffc1。内存中存储的都是2进制数据。 3.在调试过程中,我们采取打印的方式查看变量的地址: int c = 10; // 以16进制形式输出地址 printf("16进制:%x\n", &c); // 以10进制形式输出地址 printf("10进制:%d", &c); 输出结果: 一、一维数组 1.一维数组的定义 * 定义的形式为:类型 数组名[元素个数] int a[5]

Spark之 RDD

雨燕双飞 提交于 2020-01-29 11:26:05
简介 RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。   Resilient:弹性,它表示的含义rdd的数据是可以保存在内存中或者是磁盘中。   Distributed:它的数据是分布式存储的,后期方便于进行分布式计算。   Dataset:它就是一个集合,集合里面可以存放了很多个元素。 RDD的属性 1 A list of partitions 一个分区列表,在这里表示一个rdd中有很多个分区(partitions),Spark任务的计算以分区为单位,每一个分区就是一个task。读取hdfs上文件产生的RDD分区数跟文件的block个数相等 rdd1=sc.textFile("/words.txt") 2 A function for computing each split Spark中RDD的计算是以分区为单位的,每个RDD都会实现compute函数以达到这个目的。compute函数会对迭代器进行复合,不需要保存每次计算的结果。 3 A list of dependencies on other RDDs 一个RDD会依赖于其他多个RDD,这里就涉RDD之间的依赖关系,RDD的每次转换都会生成新的RDD,Spark任务的容错机制就是根据这个特性而来

.NET基础面试题整理

泪湿孤枕 提交于 2020-01-29 04:25:45
1.什么是.NET?什么是CLI?什么是CLR?IL是什么? (1).net用于代码编译和执行的集成托管环境,换句话,它管理应用程序运行的方方面面,包括首次运行的编译,为程序分配内存 存储数据和指令,对于应用程序授予或拒绝相应的权限,并启动管理应用程序的执行,剩余内存的在分配。由于所有.net应用程序 都是在.net framework上面执行,所以开发人员只需考虑与.net framework打交道,而不必关系和底层操作系统上面的实现 包括CLR和BCL (2).CLI(common language infrastructure)公共语言基础结构,一项国际性的标准,没有规定标准具体如何实现。相反,它描述了一个 CLI平台在符合标准的前提下应该具有什么行为。包含了:运行时(CLR),公共中间语言(CIL),公共类型系统(CTS), 公共语言规范(CLS),元数据(Metadata),框架(framework) (3)CLR:公共语言运行时,负责加载和运行程序 IL:中间语言,C#编译器将C#代码转换成IL,运行时能够理解IL,并编译成机器码 2.JIT是什么,它是如何工作的?GC是什么,简述一下GC的工作方式? JIT:Just in time,C#或者是VB.NET的代码首先被编译为IL存储在本地,当要运行这些代码的时候,CLR对IL进行第二次编译转换成机器码运行。好处

Python2和3字符编码的区别

戏子无情 提交于 2020-01-28 17:46:58
Python2和3字符编码的区别 一、字符编码应用之Python 1.1 执行Python程序的三个阶段 Python test.py (再强调一遍,执行test.py的第一步,一定是先将文件内容从硬盘读入到内存中) test.py文件内容以gbk格式保存的,内容为: [ 阶段一:启动Python解释器 阶段二:Python解释器此时就是一个文本编辑器,负责打开文件test.py,即从硬盘中读取test.py的内容到内存中 此时,Python解释器会读取test.py的第一行内容, #coding:utf-8 或 #-*-coding:utf-8-*- ,以此决定以什么编码格式将代码读入内存,这一行就是设定Python解释器这个软件使用的编码格式。 可以用sys.getdefaultencoding()查看,如果不在Python文件指定头信息 #-*-coding:utf-8-*- ,那就使用Python默认的编码格式。 import sys sys.getdefaultencoding() Copy'utf-8' Python2中默认使用ascii,Python3中默认使用utf-8。 改正:在test.py指定文件头,字符编码一定要为gbk。即更正为 #coding:gbk 你好啊 阶段三:读取已经加载到内存的代码(Unicode编码格式),然后执行

堆栈和托管堆以及装箱和拆箱的理解

一个人想着一个人 提交于 2020-01-28 07:16:56
C#中的类型都来源于system.object类型,分为值类型和引用类型,分别存在内存的堆栈和托管堆中,值类型一般都是简单类型如int float double等,他们保存在堆栈中,是按后进先出(LIFO)原则存储数据项的一种数据结构。在计算机系统中,栈特指处理器支持的一块内存区域,其中保存着局部变量。工作方式是先分配内存的变量后释放(先进后出原则),所以一旦出了作用域就会被释放,所以在整个项目中无法使用,这个时候就想到了托管堆。 堆(托管堆)存储引用类型。此堆非彼堆,.NET中的堆由垃圾收集器自动管理。与堆栈不同,堆是从下往上分配,所以自由的空间都在已用空间的上面。现在来举个例子看看在内存中是如何通过堆栈和托管堆保存数据的。 Int a=100; 那么在堆堆栈中就会分出一块空间用来保存a,值为100,现在有一个方法 Int GetNum(int b) { b=500; Return b; } 这个时候把a的值作为参数传给这个方法,那么此时a的值会不会变成500呢,这个就是我们重点讨论的问题,方式就是一个临时的,用完就会被释放,其实我们只是复制了一个a的到方法里了,所有a的值不会改变 Student stu=new Student(); 我们知道上面的是一个引用类型的变量,它在内部的进程是 首先在堆栈中分出一块空间用来放Student stu的引用,然后将new Student(

浅谈Swift的属性(Property)

守給你的承諾、 提交于 2020-01-28 05:31:06
原文博客地址: 浅谈Swift的属性(Property) 今年期待已久的 Swift5.0 稳定版就已经发布了, 感兴趣的小伙伴可看我的这篇博客: Swift 5.0新特性更新 这篇博客可主要分享 Swift 的属性的相关介绍和剖析, 测试环境: Xcode 11.2.1 , Swift 5.1.2 属性分类 在 Swift 中, 严格意义上来讲属性可以分为两大类: 实例属性和类型属性 实例属性( Instance Property ): 只能通过实例去访问的属性 存储实例属性( Stored Instance Property ): 存储在市里的内存中, 每个实例都只有一份 计算实例属性( Computed Instance Property ) 类型属性( Type Property ): 只能通过类型去访问的属性 存储类型属性( Stored Type Property ): 整个程序运行过程中就只有一份内存(类似全局变量) 计算类型属性( Computed Type Property ) 类型属性可以通过 static 关键字定义; 如果是类也可以通过 class 关键字定义 实例属性属于一个特定类型的实例,每创建一个实例,实例都拥有属于自己的一套属性值,实例之间的属性相互独立 为类型本身定义属性,无论创建了多少个该类型的实例,这些属性全局都只有唯一一份

变量进阶

北慕城南 提交于 2020-01-27 03:54:07
01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的 1.1 引用的概念 在 Python 中 变量 和 数据 是分开存储的 数据 保存在内存中的一个位置 变量 中保存着数据在内存中的地址 变量 中 记录数据的地址 ,就叫做 引用 使用 id() 函数可以查看变量中保存数据所在的 内存地址 注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用 变量 不再 对之前的数据引用 变量 改为 对新赋值的数据引用 1.2 变量引用 的示例 在 Python 中,变量的名字类似于 便签纸 贴在 数据 上 定义一个整数变量 a ,并且赋值为 1 代码 图示 a = 1 将变量 a 赋值为 2 代码 图示 a = 2 定义一个整数变量 b ,并且将变量 a 的值赋值给 b 代码 图示 b = a 变量 b 是第 2 个贴在数字 2 上的标签 1.3 函数的参数和返回值的传递 在 Python 中,函数的 实参 / 返回值 都是是靠 引用 来传递来的 def test(num): print("-" * 50) print("%d 在函数内的内存地址是 %x" % (num, id(num))) result = 100 print("返回值 %d 在内存中的地址是 %x" % (result

Spark学习之路 (八)SparkCore的调优之开发调优[转]

别说谁变了你拦得住时间么 提交于 2020-01-26 18:06:36
前言 在大数据计算领域,Spark已经成为了越来越流行、越来越受欢迎的计算平台之一。Spark的功能涵盖了大数据领域的离线批处理、SQL类处理、流式/实时计算、机器学习、图计算等各种不同类型的计算操作,应用范围与前景非常广泛。在美团•大众点评,已经有很多同学在各种项目中尝试使用Spark。大多数同学(包括笔者在内),最初开始尝试使用Spark的原因很简单,主要就是为了让大数据计算作业的执行速度更快、性能更高。 然而,通过Spark开发出高性能的大数据计算作业,并不是那么简单的。如果没有对Spark作业进行合理的调优,Spark作业的执行速度可能会很慢,这样就完全体现不出Spark作为一种快速大数据计算引擎的优势来。因此,想要用好Spark,就必须对其进行合理的性能优化。 Spark的性能调优实际上是由很多部分组成的,不是调节几个参数就可以立竿见影提升作业性能的。我们需要根据不同的业务场景以及数据情况,对Spark作业进行综合性的分析,然后进行多个方面的调节和优化,才能获得最佳性能。 笔者根据之前的Spark作业开发经验以及实践积累,总结出了一套Spark作业的性能优化方案。整套方案主要分为开发调优、资源调优、数据倾斜调优、shuffle调优几个部分。开发调优和资源调优是所有Spark作业都需要注意和遵循的一些基本原则,是高性能Spark作业的基础;数据倾斜调优

线程堆栈(Thread Stack)和托管堆(Managed Heap)

孤人 提交于 2020-01-26 04:35:06
内存格局 通常分为四个区 全局数据区:存放全局变量,静态数据,常量 代码区:存放所有的程序代码 栈区:存放为运行而分配的局部变量,参数,返回数据,返回地址等, 堆区:即自由存储区 值类型变量与引用类型变量 的内存分配模型也不一样。为了理解清楚这个问题,首先必须区分两种不同类型的内存区域: 线程堆栈(Thread Stack)和托管堆(Managed Heap)。 每个正在运行的程序都对应着一个进程(process),在一个进程内部,可以有一个或多个线程(thread),每个线程都拥有一块“自留地”,称为“线程堆栈”,大小为1M,用于保存自身的一些数据,比如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存区域的分配与回收不需要程序员干涉。所有值类型的变量都是在线程堆栈中分配的。 另一块内存区域称为“堆(heap)”,在.NET 这种托管环境下,堆由CLR 进行管理,所以又称为“托管堆(managed heap)”。用new 关键字创建的类的对象时,分配给对象的内存单元就位于托管堆中。 在程序中我们可以随意地使用new 关键字创建多个对象,因此,托管堆中的内存资源是可以动态申请并使用的,当然用完了必须归还。 打个比方更易理解:托管堆相当于一个旅馆,其中的房间相当于托管堆中所拥有的内存单元。当程序员用new 方法创建对象时,相当于游客向旅馆预订房间

重新认识C语言指针(上)

五迷三道 提交于 2020-01-25 20:37:37
​ 独创性并不是首次观察某种新事物,而是把旧的、很早就是已知的,或者是人人都视而不见的事物当新事物观察,这才证明是有真正的独创头脑 —尼采 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!!! 序言  指针是C语言学习者绕不过的一道坎,也是C语言学习者不得绕过的一道坎。辨别一个人C语言学的好赖就看他对指针的理解怎么样。指针内容也是工作面试经常问到的问题。本文将带你重新认识那个绊倒你的指针,以解大家的心头之惑(恨)。 为什么要学习指针?  有同学就要说了,既然指针这么难,这么不通俗易懂,为什么要学习他呢?其他高级语言都是把这块基本屏蔽掉了,不在让程序员直接操作指针,这里不直接操作指的是不让程序员用指针进行运算和强转而不是彻底没有了。举个java的例子 Object obj= new Object(); Object sec= obj; sec = new Object();  如果你去仔细研究他们的行为,就会发现 obj, sec 都只是一个指向对象的东西,可以为空,也可以修改指向,所以它们其实都是指针,只是 Java 的教材里面不在去提这东西而已,具体原因看我后面讲解便知道了。 ​ 继续说为什么学习指针,为什么学习指针就必须要说到指针的优点了。