指针

几百万数据放入内存不会把系统撑爆吗?

妖精的绣舞 提交于 2019-12-23 18:34:25
在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存的话会占用多少内存呢? 计算机的存储单位 计算机的存储单位常用的有bit、Byte、KB、MB、GB、TB后面还有但是我们基本上用不上就不说了,我们经常将bit称之为比特或者位、将Byte简称为B或者字节,将KB简称为K,将MB称之为M或者兆,将GB简称为G。那么他们的换算单位是怎样的呢? 换算关系 首先我们得知道在计算机中所有数据都是由0 1来组成的,那么存储0 1这些二进制数据是由什么存放呢?就是由bit存放的,一个bit存放一位二进制数字。所以bit是计算机最小的单位。 大部分计算机目前都是使用8位的块,就是我们上面称之为的字节Byte,来作为计算机容量的基本单位。所以我们一般称一个字符或者一个数字都是称之为占用了多少字节。 了解了上面关于位和字节的关系后,我们可以看一下其他的单位换算关系 11B(Byte 字节) = 8bit(位) 21KB = 1024B 31MB =

指针、数据类型 、const

橙三吉。 提交于 2019-12-23 17:02:55
从右往左读,遇到p就替换为“p 是一个”,遇到*就替换为“指向” 1.const int p; 读法:p是一个常量整型 2.const int* p; 读法:p是一个指向整型常量的指针 3.int const* p; 读法:p是一个指向整型常量的指针 4.int * const p; 读法:p是一个常量指针,指向整型 5.const int * const p; 读法:p是一个常量指针,指向整型常量 6.int const * const p; 读法:p是一个常量指针,指向整型常量 来源: CSDN 作者: pingxiaozhao 链接: https://blog.csdn.net/pingxiaozhao/article/details/103665840

C++用new和不用new创建类对象区别

牧云@^-^@ 提交于 2019-12-23 16:14:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。 一、new创建类对象与不new区别 下面是自己总结的一些关于new创建类对象特点: new创建类对象需要指针接收,一处初始化,多处使用 new创建类对象使用完需delete销毁 new创建对象直接使用堆空间,而局部不用new定义类对象则使用栈空间 new对象指针用途广泛,比如作为函数返回值、函数参数等 频繁调用场合并不适合new,就像new申请和释放内存一样 二、new创建类对象实例 1、new创建类对象例子: CTest* pTest = new CTest(); delete pTest; pTest用来接收类对象指针。 不用new,直接使用类定义申明: CTest mTest; 此种普通方式创建方式,使用完后不需要手动释放,该类析构函数会自动执行。而new申请的对象,则只有调用到delete时再会执行析构函数,如果程序退出而没有执行delete则会造成内存泄漏。 2、只定义类指针 这跟不用new申明对象有很大区别,类指针可以先行定义,但类指针只是个通用指针,在new之前并未为该类对象分配任何内存空间

《数据结构与算法》-2-线性表

我的梦境 提交于 2019-12-23 13:24:02
目录 1. 线性表的定义和基本操作 1.1 线性表的定义 1.2 线性表的基本操作 2. 线性表的顺序表示 2.1 顺序表的定义 2.2顺序表上基本操作的实现 3. 线性表的链式表示 3.1 单链表的定义 3.2 单链表基本操作的实现 3.3 双链表 3.4 循环链表 3.5 静态链表 4. 顺序表与链表的比较 5. 如何选择存储结构   该系列博客的目的是为了学习一遍数据结构中常用的概念以及常用的算法,为笔试准备;主要学习过程参考王道的《2018年-数据结构-考研复习指导》; 已总结章节: 《数据结构与算法》-1-绪论 《数据结构与算法》-2-线性表   上篇博客 《数据结构与算法》-1-绪论 中说到数据结构的三要素:逻辑结构、存储结构、数据的运算;其中,逻辑结构表示的是数据元素之间的关系,逻辑结构根据数据元素之间关系的不同,分成了线性结构与非线性结构,这里我们将要介绍的就是线性结构中的线性表,并根据线性表在计算机中存储结构的不同,分别介绍了:顺序存储(顺序表)、链式存储(链表);   这篇主要介绍的内容有: 线性表的定义以及基本操作 ; 线性表的顺序存储 ; 线性表的链式存储 ; 顺序表与链表的比较 ;   其知识框架如下图所示: 1. 线性表的定义和基本操作   这一节主要介绍线性表,主要内容包括:线性表的定义及基本操作; 1.1 线性表的定义   定义: 线性表是具有 相同

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则是

指针1

泪湿孤枕 提交于 2019-12-23 09:49:22
一.复习 指针 1.定义 基类型 指针变量名 2.赋值 int a; int pa=&a; 或 int a, pa=&a//定义的同时赋值 或 int p2; p2=&a;//先定义后赋值 3.两个运算符 & 取地址,后面的操作数必须是变量 *为指针运算符,后面的操作数必须是指针 int a=3; int *pa=&a; &a正确,表示a的地址 &pa正确,表示pa的地址 *a不对,a是int整型,不是指针型 *pa正确,表示的是pa指向的变量,即a *&a正确,表示的就是a *&pa,表示的是pa &*a不对,形式不对,*后必须为指针型,而a是常量 &*pa正确,表示的是pa,即&a(从右往左) 注:& 或 &如果正确使用,则两个运算符可以相互抵消 一.利用指针访问(引用)数组 1.通过下标遍历数组元素 int a【】={1,2,3,4,5}; a表示的是数组首元素的地址,是一个地址常量,不能改变,等价&a【0】 2.int pa=a;//指针变量pa指向数组首地址 相当于int pa=&a【0】;如果指针变量指向数组的首地址,此时指针变量可以使用下标,即指针变量等同于数组名,即a【1】=======pa【1】 3.当指针变量指向数组的时候,指针变量的加减运算才有意义 4.当指针变量pa指向数组a的首地址,且pa的值不能改变,且pa的值不能改变,一直指向数组的首地址,i表示下标

转帖关于new/delete的运算符和malloc()/free()的标准库函数

随声附和 提交于 2019-12-23 09:48:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> new--------delete malloc--------free 问题: 我又一个对象类,里面有一个指针链表,动态分配空间,在析构的时候释放。开始对对象进行new操作,但是执行delete对象操作的时候出错,提示在析构的时候内存有问题。可是这时候成员一个比特的内存都没有分配啊。所以析构的时候应该什么内存操作都不执行。 更奇怪的是采用free()函数就可以释放这种对象,但是内存却不见减少,整个程序内存占用节节升高?这是为什么? 回复1: 你在析构函数当中没有正确的释放你申请的内存,比如,这个对象当中有一个指针,是采用动态申请内存的,在构造函数当中应该把它的值设置为NULL,然后在某个方法当中会申请内存,是采用new方法进行申请的,在析构函当中,应该先判断该指针是否为空,如果不为空,则使用delete释放内存,然后再把该指针设置为NULL。这样就可以了,如果你在外面是采用new申请这个对象,则在使用完成后使用delete释放就可以了。 回复2: 补充一点:new和malloc虽然都是申请内存,但申请的位置不同,new的内存从free store 分配,而malloc的内存从heap分配(详情请看ISO14882的内存管理部分), free store和heap很相似,都是动态内存,但是位置不同

C++进阶之三:类型安全和STL

喜你入骨 提交于 2019-12-23 08:41:34
不要动态地处理数组 这里主要有两个意思: 不用支持动态地基类的指针进行++、+n这种操作,因为它实际会按基类大小进行偏移计算,而非预期地按照子类的大小进行偏移计算; 2.尽量在接口中使用引用而非指针,原因就在于期望清楚地表面所讨论的是一个对象,而不是对象数组; 不要使用失效对象 经常容易忽略的失效对象包括: 语义失效对象:指向已删除对象的虚悬(dangling)指针 失效的迭代器:比如,在迭代器所指向的容器开始插入之后的vector<T>::iterator i 不要使用不安全的C语言的遗留函数: strcpy\sprintf 的缓冲区都没有检查范围;strncpy\snprintf 虽然检查缓冲区界限,但是到达缓冲区界限时却不添加null。因此都是不安全的 不要使用可变长参数(...) C++ 中可变长参数的缺点包括: 缺乏类型安全性。 省略号本质是告诉编译器:关闭所有的检查,从此由我接管,启动reinterpret_cast 调用者和被调用者存在紧密耦合; 类类型对象的行为没有定义; 参数的数量未知 不要使用联合重新解释表示方式 比如一个联合中有一个long 类型的成员和一个指针类型的成员,给指针赋值,然后通过long读取其地址,这样会有问题: 不同架构和编译器中sizeof(long)可能不等于sizeof (char *) 减少了代码的可读性; 不要用memcpy 复制对象

重新认识C#: 玩转指针

Deadly 提交于 2019-12-23 04:45:12
许多文章并不鼓励在C#下使用指针开发,不过,本文偏偏要这样做。在大量尝试C#下使用指针开发之后,你会对C#有更深的认识。 在说C#下的指针之前,需要提一下C++/CLI。C++/CLI 我们可以把它看作两部分:Native C++和 Managed C++,两者可以无缝结合。对C#,我们也可以把它看作两部分:Managed C# 和 Unmanaged C#。Managed C# 和 Unmanaged C# 是我杜撰的两个词,前者就是我们通常的C#,后者就是使用指针、Struct和非托管内存的C#。事实证明,Unmanaged C#也可以玩的十分优雅——它具有C语言的大部分特性,却比C语言好用的多。 C# 与 C++/CLI之间的对应关系见下图: C++/CLI默认是 Native C++,而C# 默认是 Unmanaged C# 。除了不能内嵌汇编以及编译方式不同之外,C++/CLI和C#两者在层面上几乎是等价的。其中,C++/CLI略微偏底层一点,C#略微偏高层一点。尽管略微偏高层一点,C#仍然可以当成准系统语言来玩。你可以将Unmanaged C# 当作 mini c 来玩,区别只是,C 语言一般是编译执行的,而 Unmanaged C# 是先编译成 IL ,再使用Ngen编译成机器码或在运行时编译成机器码执行。 在C#下不鼓励使用指针,这是因为C#的定位是应用级的开发

第11课 - 新型的类型转换

大城市里の小女人 提交于 2019-12-23 02:38:10
一、C方式的强制类型转换 C语言的强制类型转换的代码如图1所示: 图1 C语言方式强制类型转换存在的问题 过于粗暴;任意类型之间都可以进行转换,编译器很难判断其正确性。 难于定位;在源代码中无法快速定位所有使用强制类型转换的语句。 二、C++的新式类型转换 C++将强制类型转换分为4种不同的类型。如下图所示; 图2 4种强制类型转换的详细介绍如下: (1)static_cast强制类型转换:用于基本类型间的转换;不能用于基本类型指针间的转换;用于有继承关系类对象之间的转换和类指针之间的转换。 (2)cosnt_cast强制类型转换:用于去除变量的只读属性;强制转换的目标类型必须是指针或引用。 (3)reinterpret_cast强制类型转换:用于指针类型间的强制转换;用于整数和指针类型间的强制转换。 (4)dynamic_cast强制类型转换:用于有继承类型的类指针间的转换;用于有交叉关系的类指针间的转换;具有类型检查的功能;需要虚函数的支持。 三、小结 C方式的强制类型转换 过于粗暴; 潜在的问题不易被发现 不易在代码中定位 新式类型转换以C++关键字的方式出现 编译器能够帮助检查潜在的问题 非常方便的在代码中定位 支持动态类型识别(dynamic_cast) 来源: CSDN 作者: 划清界限 链接: https://blog.csdn.net