- 博客(110)
- 资源 (1)
- 收藏
- 关注
原创 const 位置与指针的关系
int b = 500;const int* a = &b; [1]int const *a = &b; [2]int* const a = &b; [3]const int* const a = &b; [4]我们可以参考《Effective c++》Item21上的做法: 1, 如果const位于星号的左侧,则const就是用来修饰指针所指向的
2017-03-27 14:53:34
850
原创 AES加密算法的C++实现
一、AES 介绍AES(高级加密标准,Advanced Encryption Standard),在密码学中又称 Rijndael 加密法,是美国联邦政府采用的一种分组加密标准。这个标准用来替代原先的 DES,目前已经广为全世界所使用,成为对称密钥算法中最流行的算法之一。在 AES 出现之前,最常用的对称密钥算法是 DES 加密算法,它在 1977 年被公布成为美国政府的商用加密标准。
2017-03-13 10:57:08
2501
1
转载 设计模式遵循的七大原则
最近几年来,人们踊跃的提倡和使用设计模式,其根本原因就是为了实现代码的复用性,增加代码的可维护性。设计模式的实现遵循了一些原则,从而达到代码的复用性及增加可维护性的目的,设计模式对理解面向对象的三大特征有很好的启发,不看设计模式,很难深层地体会到面向对象开发带来的好处 。在刚开始学习中,很难做到将这些模式融汇贯通,所以这个需要我们在编码前多思考,等想充分了,在开始实践编码。下面是设计模式应当遵循的
2017-03-10 11:30:00
624
原创 Vim安装配置
1.安装好vim之后,按如下代码配置.vimrc文件set sw=4set ts=4set etset smarttabset smartindentset lbrset fo+=mBset smset selection=inclusiveset wildmenuset mousemodel=popupau FileType php setlocal dict+=~/
2017-02-17 16:30:54
543
原创 Gvim安装和配置
1.安装好了gvm之后,在安装目录下面找到_vimrc 按如下配置配置即可:2.set nocompatiblesource $VIMRUNTIME/vimrc_example.vimsource $VIMRUNTIME/mswin.vimbehave mswinset diffexpr=MyDiff()function MyDiff() let opt = '-a --bin
2017-02-17 16:03:50
623
转载 给SSD(固态硬盘)编程
简介我想为我的键值对存储项目弄一个固态硬盘(SSD)最佳存储解决方案。为此,我必须确保我完全了解SSD是如何工作的,这样就可以优化我的hash表实例来适合SSD的内部特征。网上有很多不完全和相悖的的信息,找到关于SSD的可靠信息并不简单。为了找到适当的文献和基准以说服自己,我必须要进行大量的阅读。如果我要为SSD编程,我需要知道我在做什么。研究完之后我搞明白了,相信将我所得到的结论
2017-02-08 09:29:34
8451
原创 nor flash和nand flash的区别
一、NAND flash和NOR flash的性能比较1、NOR的读速度比NAND稍快一些。2、NAND的写入速度比NOR快很多。3、NAND的4ms擦除速度远比NOR的5s快。4、大多数写入操作需要先进行擦除操作。5、NAND的擦除单元更小,相应的擦除电路更少。二、NAND flash和NOR flash的接口差别NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容
2017-02-07 09:54:01
382
原创 VS 常用快捷键
项目相关的快捷键Ctrl + Shift + B = 生成项目Ctrl + Alt + L = 显示Solution Explorer(解决方案资源管理器)Shift + Alt+ C = 添加新类Shift + Alt + A = 添加新项目到项目编辑相关的键盘快捷键Ctrl + En
2017-01-12 16:53:48
441
原创 ARM
1. ARM处理器系列 在相同指令集下,搭配不同的部件就可以组装出具有不同功能的处理器比于有无内存管理单元,有无调试功能等。它们可以分为8个系列,系类名中有7个后缀,这些后缀可以组合,含义如下: T:表示支持Thumb指令集。 D:表示支持片上调试(Debug)。 M:表示内嵌硬件乘法器(Multiplier). I:支持片上断点和调试点。
2017-01-06 10:21:58
285
原创 宏函数打印日志
#define 宏函数 预定义符号表: 符号示例含义__FILE__/home/david/hello.c正在预编译的源文件名__LINE__5文件当前的行号__FUNCTION__main当前所在的函数名 序表:符号示例含义_
2017-01-05 13:16:32
435
转载 可变参数列表及printf函数的实现
转载链接点击打开链接 一直没有搞懂printf函数是怎么实现的,今天又看了一下可变参数列表的函数的编写,大概的了解了一点。反推出原来没想到的一个东西,那就是函数形参列表中的变量在内存中的位置是顺次排列的。头文件Stdarg.h里的几个宏定义就是利用了这么一点,顺次获取多个参数,感觉还是挺笨的一个方法。先看一个最简单的可变参数列表的函数: void myte
2017-01-04 19:28:06
329
原创 C/C++可变参数函数
1.不定参数的函数,参数的个数可变,参数的类型不定。最常见的例子是printf函数, scanf函数,cout ,cin。c/c++中,为了通知编译器函数的参数个数和类型可变,就必须满足以下三个点结束该函数的声明。//printf 函数的声明int printf(const char* _Format,...);//scanf函数声明int scanf(const char *_Fo
2017-01-04 18:02:43
282
转载 Makefile
目的:编写一个实用的makefile,能自动编译当前目录下所有.c/.cpp源文件,支持二者混合编译。并且当某个.c/.cpp、.h或依赖的源文件被修改后,仅重编涉及到的源文件,未涉及的不编译。二要达到这个目的,用到的技术有:1-使用wildcard函数来获得当前目录下所有.c/.cpp文件的列表。2-make的多目标规则。3-make的模式规则。4-用gcc -MM命
2016-12-29 14:44:36
373
原创 C++ 面向对象基础
1. 类和实例 类就是具有相同的属性和功能的对象的抽象集合。 实例,就是一个真实的对象,实例化就是创建对象的过程,使用new关键字来创建 class Cat{ public string Shout() { return "苗"; }}private void button1_Click(ob
2016-12-28 14:54:25
320
原创 C/C++的区别:面向对象的思想
C/C++的区别是什么呢?对于学C学的不怎么的同时学C++又没有几天的我,真找不到其间的区别。面向过程与面向对象似乎就是天平的两端,挪过来挪过去都是等量的存在。看过孙鑫老师的视频之后,面向对象的思想出现在我的认知里,如此的清晰;当然可能是因为之前面向过程的思想没有留下烙印的缘故。 C中的结构体:struct Point //定义{ int x; int y;};
2016-12-22 16:41:40
1246
转载 SSD性能(跑分)下降的主要原因
对于接触SSD不久的人,经常都会产生一种疑问,那就是当SSD使用过一段时间后,再运行测试软件,得到的成绩几乎都肯定要比刚买回来时差,而且时间越长,差距就越明显,这是为什么呢? 大家从阅读论坛里的内容已经了解SSD的工作原理及特点,相比传统HDD,SSD最大的差异就在于其使用的NAND闪存无法进行覆盖操作,在已经被写入数据的位置,要重复写入的话,SSD就必须先对该位置进行擦除的操作,
2016-12-21 11:25:20
7099
转载 使用BT下载是否会损毁SSD?
问:BT等P2P下载方式是不是会减少SSD固态硬盘寿命? 答:首先揭晓答案:基本不会有什么影响。 我们先来看看SSD固态硬盘与传统机械硬盘的区别。通过下图可以看到,传统机械硬盘由盘片、磁头、转轴、控制电机等部分组成,工作时盘片转动、磁头定位在盘片的指定位置上进行读写操作,从某种意义上与老式留声机的结构相似。传统硬盘的优势在于容量大、成本低,寿命也相对较长,适合进行
2016-12-21 11:24:27
4802
转载 SSD为何必须分区对齐,原理是什么
通过本版SSD相关知识的介绍,大家应该已经知道,NAND颗粒的最小写入单位是页,而一般每个页的大小是4KB。在HDD时代,分区起始扇区的定义在第63个扇区,也就是31.5KB的位置,这里各位应该会发现问题了,31.5KB并不是4KB的整数倍,若继续使用这个分区方式,势必导致以后每写入一个页(4KB)的数据,都必须要横跨写入到2个页内,这样不单写入时间增加一倍,WA同样也增加了一倍(写一页实际变成写
2016-12-21 11:23:07
1656
转载 WL(Wear leveling)磨损平衡
闪存寿命是以P/E次数来计算的,而WL就是确保闪存内每个块被写入的次数相等的一种机制。若没有这个机制,SSD内的闪存颗粒就无法在同一时间内挂掉,那对用户来说就是灾难。 会出现这种情况的原因在于,用户在LBA空间里的数据更新速度是不同的,有部分是经常需要更新,而有些却长期不需要变更,因此若没有WL,很显然那些经常被更新的数据所在的闪存寿命会首先被消耗完毕,而不怎么需要变更的数据所在的
2016-12-21 11:21:02
1305
转载 FTL(Flash translation layer)闪存转换层
闪存的读写单位为页,而页的大小一般为4KB或8KB,但我们的操作系统读写数据是按HDD的扇区尺寸进行的(512Byte(字节)),更麻烦的是闪存擦除以块作单位,而且未擦除就无法写入,这导致操作系统现在使用的文件系统根本无法管理SSD,需要更换更先进、复杂的文件去解决这个问题,但这样就会加重操作系统的负担。 而为了不加重操作系统的负担,SSD采用软件的方式把闪存的操作虚拟成磁盘的独立
2016-12-21 11:19:29
1363
转载 GC(Garbage collection)垃圾回收
在前面向大家讲解FTL时,我们提到了GC的操作,所谓GC就是把一个闪存块里的‘有效’页数据复制到一个‘空白’块里,然后把这个块完全擦除。GC是SSD里的一个非常关键的操作,其效率对性能有决定性影响。闪存块里‘有效’页的数量对GC效率有决定性的影响,因数量越少,需要复制的页就越少, 花费的时间也越少,效率就高了。(GC操作参考下图)请看下图,把X块和Y块里的“有效”页复制到N块里,然后擦
2016-12-21 11:17:42
559
转载 Trim(有翻译为:修剪,但非正式翻译)
Trim,其实是一个ATA指令,并无正式中文名称,操作系统发送此指令给SSD主控,以通知它哪些数据占用的地址是‘无效’的。 在讲解Trim的重要性前,先说一点文件系统的相关知识。当我们在操作系统中删除一个文件时,系统并没有真正删掉这个文件的数据,它只是把这些数据占用的地址标记为‘空’,即可以覆盖使用。但这只是在文件系统层面的操作,硬盘本身并不知道那些地址的数据已经‘无效’,除非系统
2016-12-21 11:16:26
855
转载 OP(Over-provisioning)预留空间
SSD上的OP指的是用户不可操作的容量,大小为实际容量减去用户可用容量,OP区域一般被用于优化操作如:WL,GC和坏块映射等。 OP一般分三层(见下图)。第一层容量固定为SSD标称容量的7.37%,这是因为标称容量采用千进制为单位,而NAND颗粒容量单位为1024进制,两者正好相差约7.37%。这部分空间被默认用于作OP。第二层OP是否存在及容量大小取决于厂商设置。第三层OP是用户
2016-12-21 11:15:27
1724
转载 WA(Write Amplification)写入放大
WA是闪存及SSD相关的一个极为重要的属性。由于闪存必须先擦除才能再写入的特性,在执行这些操作时,数据都会被移动超过1次。这些重复的操作不单会增加写入的数据量,还会减少闪存的寿命,更吃光闪存的可用带宽而间接影响随机写入性能。WA这个术语在2008年被Intel公司和SiliconSystems公司(于2009 年被西部数据收购)第一次提出并在公开稿件里使用。 举个最简单的例子:
2016-12-21 11:14:20
1533
转载 BBM(Bad Block Management)坏块管理
不管WL算法如何高明,在使用中都会碰到一个头痛的问题,那就是坏块,所以一个SSD必须要有坏块管理机制。何谓坏块?一个闪存块里包含有不稳定的地址,不能保证读/写/擦时数据的准确性。 坏块分出厂坏块和使用过程中出现的坏块,SSD有坏块表来管理坏块。出厂坏块在上面会有标记,所以很容易就能被识别,而使用中出现的坏块就要靠主控的能力了。一般来说,越到闪存生命的后期(P/E数开始接近理论最
2016-12-21 11:11:03
1070
转载 ECC(Error Checking and Correction)校验和纠错
ECC的全称是 Error Checking and Correction or Error correction Coding,是一种用于差错检测和修正的算法。上一节的BBM中我们提到过,NAND闪存在生产和使用中都会产生坏块,BBM就是坏块的管理机制,而要有效管理坏块的首要前提就是有可靠的坏块检测手段。如果操作时序和电路稳定性不存在问题,NAND闪存出错的时候一般不会造成整个Block或Pag
2016-12-21 10:30:03
2649
转载 Makefile模板
1,生成可执行文件的Makefile##############################################################################source file#源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件SOURCE := $(wildcard *.c) $(wildcard *.cpp)OBJS
2016-12-20 19:45:48
332
转载 c++容器
C++中的容器大致可以分为两个大类:顺序容器和关联容器。顺序容器中有包含有顺序容器适配器。顺序容器:将单一类型元素聚集起来成为容器,然后根据位置来存储和访问这些元素。主要有vector、list、deque(双端队列)。顺序容器适配器:stack、queue和priority_queue。关联容器:支持通过键来高效地查找和读取元素。主要有:pair、set、map、multiset和mul
2016-12-20 11:13:55
395
转载 C++面向对象设计
1. C++面向对象程序设计的重要概念 早期革命影片里有这样一个角色,他说:“我是党代表,我代表党,我就是党。”后来他给同志们带来了灾难。 会用C++的程序员一定懂得面向对象程序设计吗? 不会用C++的程序员一定不懂得面向对象程序设计吗? 两者都未必。就象坏蛋入党后未必能成为好人,好人不入党未必变成坏蛋那样。 我不怕触犯众怒地说句大话:“C++没有高手,C 语言才有高
2016-12-19 11:29:21
417
转载 LDPC
SSD控制器芯片中采用的纠错编码(ECCs)的类型正在发生一场演变,相信许多这篇博文的读者对此都有所了解。传统上采用的纠错码是基于群变换的博斯-查德胡里-霍昆格母(BCH)码,对于大尺寸的NAND闪存而言完全胜任。然而,对更为廉价及密度更高的NAND闪存的需求意味着BCH不再够用,为了寻求替代方法,多数人目前都选择了低密度奇偶校验码(LDPC)。 本篇博文将讲述这场演变的意义所在及其对我们P
2016-12-16 17:32:56
8565
转载 linux list
#ifndef _LINUX_LIST_H#define _LINUX_LIST_H#ifdef __KERNEL__#include #include #include #include /* * Simple doubly linked list implementation. 简单的双向链表实现 * * Some of the internal functi
2016-12-15 13:44:06
474
原创 assert的使用方法以及extern的使用
1. assert 宏的原型定义在,其作用是如果他的条件返回错误,则终止程序执行。2. extern 的使用首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全
2016-12-13 12:14:35
336
转载 C C++
1.new、delete、malloc、free关系delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之
2016-12-12 13:06:56
1867
原创 GIT 命令参考手册
git init # 初始化本地git仓库(创建新仓库)git config --global user.name "xxx" # 配置用户名git config --global user.email "xxx@xxx.com"
2016-12-05 15:17:21
303
原创 linux常用命令
下面介绍的都是一些命令行工具,这些工具在几位回答者的日常工作中都很有用。对于任何不了解的命令,请使用“man “查看,或者使用Google。有些命令需要先用 yum, apt-get install 命令安装。1 基本命令了解基本的bash通读整个bash man page.学习VIM在Linux系统上,虽然你有Emacs和Eclipse,但是VIM仍然是无出其右的利器。了
2016-12-02 15:08:20
241
转载 C++ LIST
双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素。在STL中,list和vector一样,是两个常被使用的容器。和vector不一样的是,list不支持对元素的任意存取。list中提供的成员函数与vector类似,不过list提供对表首元素的操作push_front、pop_front,这是vector不具备的。和vector另一点不
2016-11-24 14:30:55
299
原创 c++ list的介绍及使用
Lists将元素按顺序储存在链表中. 与 向量(vectors)相比,它允许快速的插入和删除,但是随机访问却比较慢.assign() 给list赋值back() 返回最后一个元素begin() 返回指向第一个元素的迭代器clear() 删除所有元素empty() 如果list是空的则返回trueend() 返回末尾的迭代器erase() 删除一个元素fr
2016-11-24 11:18:03
236
原创 ubuntu14.04下安装搜狗输入法
1.打开搜狗输入法Linux版的官网http://pinyin.sogou.com/linux/?r=pinyin,并下载你需要的版本,这里选择64位版。2.在Ubuntu14.04下可以直接点击下载的文件进入软件中心进行安装(这里的图是已经安装过的,没有安装过的按照Ubuntu的提示安装)。3.接下来就是在终端中输入im-config,这时会出现一个对话框,点击OK,有一
2016-11-24 11:09:18
350
转载 RS16
Reed Solomon Codec C code implement!//this code is from Internet, not mine. thank for the author//C code begin//////////////////////////////////////////////////////////////////////////////** Reed
2016-11-14 13:41:54
1072
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅