C++
文章平均质量分 69
yal49
这个作者很懒,什么都没留下…
展开
-
选择排序及改进方法
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法(比如序列[5, 5, 3]第一次就将第一个[5]与[3]交换,导致第一个5挪动到第二个5后面)。简单选择排序:对比数组中前一个元素跟后一个元素的大小,如果后面的元素比前面的元原创 2016-08-15 20:05:08 · 5443 阅读 · 1 评论 -
read( )函数注意事项与不足
今天在练习使用dup文件描述符重定向时,从标准输入流读取数据时同时练习了read()函数和fgets()函数,因为以前没有过多使用过read()函数,所以出现了一想不到的错误,刚开始调了半天才发现是read()函数的错误。为了防止以后有不熟悉read()函数的同学在使用过程中再出错,所以今天我们来解析一下read()函数。如有不足的地方请大家指出。先说出结果吧:个人觉得循环中最好不要用read原创 2016-08-13 00:38:35 · 8354 阅读 · 1 评论 -
static
全局静态变量:该变量在全局数据区分配内存;未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0);静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的;静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量。对于一个完整的程序,在内存中的分布情况如下图:代码区原创 2016-09-01 21:34:07 · 451 阅读 · 0 评论 -
函数调用过程原理及栈帧分析
一、栈帧栈帧:“栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。实际上,可以简单理解为:栈帧就是存储在用户栈上的(当然内核栈同样适用)每一次函数调用涉及的相关信息的记录单元。我们从栈开始来理解什么是栈帧,首先必须明确一点也是非常重要的一点,栈是向下生长的,所谓向下生长是指从内存高地址->低地址的路径延伸,那么就很明显了,栈有栈底和栈顶,那么栈顶的地址要比栈底低。对x原创 2016-08-09 22:34:52 · 2270 阅读 · 0 评论 -
sizeof和strlen区别详解
"引自百度百科"strlenstrlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。sizeof C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来!原创 2016-08-09 20:46:37 · 5700 阅读 · 0 评论 -
string类的写时拷贝与引用计数
由于浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃。实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数。由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间。这种方法就是写时拷贝。在构造函数中开辟新的空间时多开辟4个字节的空原创 2016-08-31 11:19:56 · 706 阅读 · 1 评论 -
const实现机制及与#define的区别
const与#define的区别(1) 编译器处理方式不同 define宏是在预处理阶段展开。 const常量是编译运行阶段使用。(2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开。 const常量有具体的类型,在编译阶段会执行类型检查。(3) 存储方式不同 define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存转载 2016-08-08 17:21:55 · 2186 阅读 · 2 评论 -
详解栈区、堆区、全局区、文字常量区、程序代码区
一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变转载 2016-08-08 17:06:25 · 19392 阅读 · 4 评论 -
内存字节对齐
上面是你随便 google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则:(在没有#pragma pack宏的情况下,务必看完最后一行)1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要原创 2016-08-16 16:12:08 · 363 阅读 · 0 评论 -
C++实现内存复制函数(memmove解决内存重叠)
memmove函数用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。当dest指向count区域时,目标区域和源区域有重叠,从目标区域复制3到dest时会覆盖源区域的5,复制以后结果因此发生存在区域重叠时采用逆向复制void* my_memmov原创 2016-04-16 22:23:31 · 8082 阅读 · 1 评论 -
C++实现 一个数组实现两个栈
一个数组实现两个栈(两种方法)1.数组两边作栈底,往中间走走#pragma once#define MAX_SIZE 8typedef int DataType;template //模板类class DoubleStack{public: DoubleStack() :_top1(0), _top2(MAX_SIZE-1) { _array = new原创 2016-04-08 23:39:40 · 1503 阅读 · 0 评论 -
细说new与malloc的10点区别
new与malloc的10点区别: 1.申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存转载 2016-05-20 22:11:04 · 324 阅读 · 0 评论 -
c++之pair
Pair类型概述pair是一种模板类型,其中包含两个数据值,两个数据的类型可以不同,基本的定义如下: pair a;表示a中有两个类型,第一个元素是int型的,第二个元素是string类型的,如果创建pair的时候没有对其进行初始化,则调用默认构造函数对其初始化。 pair a("James", "Joy");也可以像上面一样在定义的时候直接对其初始化。 由于p转载 2016-08-26 22:19:17 · 719 阅读 · 0 评论