自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Super的博客

传播正能量,大家共同进步

  • 博客(144)
  • 资源 (4)
  • 收藏
  • 关注

原创 深度探索C++对象模型(七)站在对象模型的尖端

如果我们定义一个指针,指向特定的实例,像这样:Point<float> *ptr=0;程序中什么也没有发生。为什么呢?因为一个指向class object的指针,本身并不是一个class object,编译器不需要知道与该class有关的任何members的数据或object布局数据。所以将“Point的一个float实例”实例化也就没有必要了。在C++ Standard完成之前,“声明一个指针指向

2016-10-31 12:57:28 405

原创 深度探索C++对象模型(六) 执行期语意学

(一)对象的构造和析构(Object Construction and Destruction) 一般而言我们会把object尽可能放置在使用它的那个程序区段附近,这么做可以节省非必要的对象产生操作和摧毁操作。 全局对象 如果我们有以下程序片段:Matrix identitymain(){ //identity 必须在此处被初始化 Matrix m1=identity;

2016-10-30 21:31:59 1473

原创 深度探索C++对象模型(五)构造、析构、拷贝语意学

考虑下面这个abstract base class声明:class Abstract_base{public: virtual ~Abstract_base()=0; virtual void interface() const =0; virtual const char* mumble() const {return _mumble;}protected:

2016-10-30 11:34:04 807

原创 深度探索C++对象模型(四)Function语意学

C++支持三种类型member functions:static、nonstatic和virtual,每一种类型被调用的方式都不相同。 (一)Member的各种调用方式1、Nonstatic Member Functions(非静态成员函数) C++的设计准则之一就是:nonstatic member function至少必须和一般的nonmember function有相同的效率。也就是说,如

2016-10-29 22:13:57 687

原创 深度探索C++对象模型(三)Data语意学

(一)Data Member的布局Nonstatic data members在class object 中的排列顺序将和其被声明的顺序一样,任何中间介入的static data members都不会被放进对象布局之中。static data members存放在程序的data segment中,和个别的class objects无关。C++ Standard要求,在同一个access sectio

2016-10-29 20:05:17 772

原创 构造函数

ARM寄存器 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个状态寄存器都是可访问的。ARM状态下的通用寄存器与程序计数器 ARM状态下的程序寄存器 通用寄存器R0~R15R13_svc、R1

2016-10-29 10:47:16 364

原创 ARM汇编编程

ARM汇编分类 目前常用的ARM汇编指令有两种: 1、ARM标准汇编:适用于ARM公司的汇编器,适合在Windows平台下使用,如ADS中使用。 2、GNU汇编:适用于GNU交叉编译工具链中的汇编器,适合于Linux开发平台。汇编程序的框架.section .data <初始化的数据>.section .bss <未初始化的数据>.section .text.global

2016-10-29 00:14:08 755

原创 ARM寄存器详解

ARM寄存器 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式。但在任何时候,通用寄存器R14~R0、程序计数器PC、一个状态寄存器都是可访问的。ARM状态下的通用寄存器与程序计数器 ARM状态下的程序寄存器 通用寄存器R0~R15R13_svc、R1

2016-10-28 11:33:53 34297 2

原创 工欲善其事必先利其器

裸机开发流程 1.编写裸机程序; 2.调试裸机程序; 3.生成2进制映像(编译、链接、格式转换); 4.烧写/运行2进制映像。嵌入式开发模型——交叉开发 在嵌入式开发过程中有宿主机和目标机的角色之分:宿主机是执行编译、链接嵌入式软件的计算机;目标机是运行嵌入式软件的硬件平台。常用交叉工具 1、交叉编译器,arm-linux-gcc; 2、交叉链接器,arm-linux-ld; 3、交

2016-10-28 09:52:40 443

转载 linux网络编程之System V 信号量(三):基于生产者-消费者模型实现先进先出的共享内存段

生产者消费者问题:该问题描述了两个共享固定大小缓冲区的进程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。 我们可以用信号量解决生产者消费者问题,如下图: 定义3个信号量,sem_fu

2016-10-26 15:31:00 600

转载 linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题

一、我们在前面讲进程间通信的时候提到过进程互斥的概念,下面写个程序来模拟一下,程序流程如下图: 即父进程打印字符O,子进程打印字符X,每次打印一个字符后要sleep 一下,这里要演示的效果是,在打印程序的边界有PV操作,故每个进程中间sleep 的时间即使时间片轮转到另一进程,由于资源不可用也不会穿插输出其他字符,也就是说O或者X字符都会是成对出现的,如OOXXOOOOXXXXXXOO….

2016-10-26 15:17:15 1197

转载 4、搭建一个后台服务器--服务端代码(异步,大并发)

#include <stdio.h> #include <time.h> #include <fcntl.h> #include <stdlib.h> #include <errno.h> #include <string.h> #ifndef WIN32 #include <unistd.h> #include <sys/epoll.h> #include <sy

2016-10-26 10:39:16 724

转载 3、搭建一个后台服务器--服务端(阻塞)

为什么要在标题后面加个“阻塞”呢,因为系统为了增大并发,减小等待(阻塞),建立了另一种事件模式,后文将介绍,这里只介绍阻塞的模型。 阻塞服务器要干的事大致可以分为以下几步: 1.创建服务端监听连接 2.产生用户连接 3.接收用户请求 4.发送返回给用户敲码过程如下: 设置监听地址与端口:addr_server.sin_family = AF_INET; addr_server.sin

2016-10-26 10:36:01 596

转载 2、搭建一个后台服务器--客户端

上篇规定的协议请求部分: request: username/password, 约定username与password 各占32个字节(联同末位0)可以将客户端的逻辑设计成: 1.将username,password 封装进buffer 2.连接服务端 3.发送buffer 4.接收二进制的系统当前时间 5.显示时间 代码如下: 服务端地址设置部分:addr_server.s

2016-10-26 10:26:31 832

转载 1、搭建一个后台服务器--引子

最近去了几家公司面试,有一些大公司(比如企鹅)的考核内容真心弱智,考的都是些算法,尼玛,拿一个刚毕业的学生来做说不定也可以过的,看来本来就不是在招搞服务器的,举个例子,企鹅多个部门都曾出的一道题:如何知道集合A,B中的相关性。 意思就是哪些元素在A,B之中都有,哪些元素在A,B中不都出现。其实解法很简单,学过算法的完全可以做到 。我们知道集合具有互异性,就是集合中的元素只能出现一次,可以建一个ma

2016-10-26 10:14:04 990

转载 从零开始学C++之对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector

一、对象语义与值语义1、值语义是指对象的拷贝与原对象无关。拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝)。比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义2、对象语义指的是面向对象意义下的对象对象拷贝是禁止的(Noncopyable) OR 一个对象被系统标准的复制方式复制后,与被复制的对象之间依然共享底层资源,对任何一个的

2016-10-26 09:53:12 450

转载 从零开始学C++之异常(三):异常与继承、异常与指针、异常规格说明

一、异常与继承 如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面#include <iostream>#include <string>using namespace std;class MyException{public: MyException(const char *message) : messag

2016-10-26 09:35:02 448

转载 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

一、程序错误 编译错误,即语法错误。程序就无法被生成运行代码。运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数相乘可能溢出 数组越界……二、异常 (一)、异常语法throw 表达式;try{ //try

2016-10-26 09:28:40 536

转载 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

一、C语言错误处理方法 1、返回值(if … else语句判断错误) 2、errno(linux 系统调用) 3、goto语句(函数内局部跳转) 4、setjmp、longjmp(Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. )#defin

2016-10-26 09:19:53 482

转载 从零开始学C++之RTTI、dynamic_cast、typeid、类与类之间的关系uml

一、RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be determined during program execution.There are three main C++ language elements to run-time type informati

2016-10-26 09:05:24 364

转载 从零开始学C++之虚继承和虚函数对C++对象内存模型造成的影响(类/对象的大小)

首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n)所指定的值)的整数倍。 整个结构体也要对齐,结构体总大小对齐至各个min中最大值的整数倍。 win32 可选的有1, 2, 4, 8, 16 linux 32 可选的有1, 2, 4 类的

2016-10-26 08:23:52 529

转载 从零开始学C++之虚函数与多态(二):纯虚函数、抽象类、虚析构函数

一、纯虚函数 虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 定义纯虚函数:class 类名{ virtual 返回值类型 函数名(参数表) = 0;};纯虚函数不需要实

2016-10-25 22:46:34 484

转载 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图

一、多态 多态性是面向对象程序设计的重要特征之一。 多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。 多态的实现: 函数重载 运算符重载 模板 虚函数 (1)、静态绑定与动态绑定 静态绑定 绑定过程出现在编译阶段,在编译期就已确定要调用的函数。 动态绑定 绑定过程工作在程序运行时执行,在程序运行时才确定将要调用的函数。二、虚函数 虚函数的概念:在基类

2016-10-25 22:34:48 381

转载 从零开始学C++之继承(三):多重继承、虚继承与虚基类

一、多重继承单重继承——一个派生类最多只能有一个基类 多重继承——一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,…. {….}; 派生类同时继承多个基类的成员,更好的软件重用 可能会有大量的二义性,多个基类中可能包含同名变量或函数多重继承中解决访问歧义的方法:基类名::数据成员名(或成员函数(参数表)) 明确指明要访问定义于哪个基类中的成员#includ

2016-10-25 22:18:10 456

转载 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换

一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。 派生类的构造函数需要给基类的构造函数传递参数#include <iostream>using n

2016-10-25 22:11:41 522

转载 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别

一、继承 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。 继承是使用已经编写好的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。 新类称为派生类或子类,原有类称为基类或父类 派生类是基类的具体化(一)、派生类的声明语法为:c

2016-10-25 21:27:57 417

转载 从零开始学C++之标准库类型(三):map 类简介和例程

一、标准库的map类型 使用map得包含map类所在的头文件template < class Key, class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> > >class map#include <map> 定义一个map对象: map<st

2016-10-25 21:14:18 377

转载 从零开始学C++之标准库类型(二):vector 类简介和例程

一、标准库的vector类型 vector是同一种类型的对象的集合 vector的数据结构很像数组,能非常高效和方便地访问单个元素 vector是一个类模板(class template) vector不能存放引用。template < class Type, class Allocator = allocator<Type> >class vector要使用vector

2016-10-25 20:57:49 327

转载 从零开始学C++之标准库类型(一):string 类简介和例程

一、标准库string类型 string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 ,在VC中直接F1查看template < class CharType, class Traits=char_traits<CharType>, class Allocator=allocator<CharType> >class basi

2016-10-25 20:19:35 443

转载 从零开始学C++之运算符重载(四):类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete

一、类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名();#ifndef _INTEGER_H_#define _INTEGER_H_class Integer{public: Integer(int n); ~Integer(); Integer &operator++(); //friend

2016-10-25 19:58:31 366

转载 从零开始学C++之运算符重载(三):完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载

在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符。[]运算符重载+运算符重载+=运算符重载<<运算符重载>>运算符重载String.h:#ifndef _STRING_H_#define _STRING_H_#include <iostream>using namespace std;class String{public:

2016-10-25 19:51:16 569

转载 从零开始学C++之运算符重载(二):++运算符重载、!运算符重载、赋值运算符重载

一、++运算符重载前置++运算符重载成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &);后置++运算符重载成员函数的方式重载,原型为: 函数类型 operator++(int); 友元函数的方式重载,原型为: friend 函数类型 operator++(类类型 &, i

2016-10-25 19:34:19 299

转载 从零开始学C++之运算符重载(一):以成员函数方式重载、以友元函数方式重载

一、运算符重载 运算符重载允许把标准运算符(如+、-、*、/、<、>等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式 运算符重载,本质上是函数重载 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代码更容易写、尤其是更易读时才有必要重载二、成员函数重载 成员函数原型的格式:函数类型 ope

2016-10-25 19:21:18 734

转载 从零开始学C++之友元:友元函数和友元类

一、友元介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。 友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。 友元函数 友元类二、友元函数 友元函数在类作用域外定义,但它需要在类体中进行说明 为了与该类的成员函数加以区别,定义的方式是在类中用关

2016-10-25 18:58:42 311

转载 从零开始学C++之对象的使用(三):static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

一、static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝#include <iostream>using namespace std;class Singleton{public: static Singleton *GetInstance() { if (instance_ == N

2016-10-25 18:42:35 364

转载 从零开始学C++之对象的使用(二):四种对象生存期和作用域、static 用法总结

一、四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象、静态全局对象 全局对象的构造先于main函数 已初始化的全局变量或静态全局对象存储于.data段中 未初始化的全局变量或静态全局对象存储于.bss段中 静态局部对象 已初始化的静态局部变量存储于.data段中 未初始化的静态局部变

2016-10-25 18:32:05 452

转载 从零开始学C++之对象的使用(一):static 成员变量、static 成员函数、类/对象的大小

一、static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可以用类的静态成员来解决这个问题。 非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。 (1)、static成

2016-10-25 18:14:29 329

转载 从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类与空数组

一、深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: 浅拷贝造成的问题是有两个指针指向同块内存,delete 其中一个指针,那么剩下的指针将成为野指针。编译器合成的默认拷贝构造函数和赋值运算符是浅拷贝的,如果只是普通成员的赋值,浅拷贝也是可

2016-10-25 17:59:37 341

转载 从零开始学C++之构造函数与析构函数(二):初始化列表(const和引用成员)、拷贝构造函数

一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化#include <iostream>using namespace std;class Object{public: Object(int num) : num_(num) { cout << "Object "

2016-10-25 16:38:57 627

转载 从零开始学C++之构造函数与析构函数(一):构造函数、析构函数、赋值与初始化、explicit关键字

一、构造函数、默认构造函数 (1)、构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构造函数的类型(返回类型),也不能使用void 通常情况下构造函数应声明为公有函数,一般被隐式地调用。 构造函数被声明为私有有特殊的用途,比如单例模式,以后详谈。 构造函数可以有任意类型

2016-10-25 16:15:01 385

ORB an efficient alternative to SIFT or SURF.pdf

ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法。这个算法是由Ethan Rublee, Vincent Rabaud, Kurt Konolige以及Gary R.Bradski在2011年一篇名为“ORB:An Efficient Alternative to SIFTor SURF”的文章中提出。ORB算法分为两部分,分别是特征点提取和特征点描述。特征提取是由FAST(Features from Accelerated Segment Test)算法发展来的,特征点描述是根据BRIEF(Binary Robust IndependentElementary Features)特征描述算法改进的。

2017-12-30

Leetcode题全解

leetcode习题的C++语言实现,LeetCode is a platform for preparing technical coding interviews. Pick from an expanding library of more than 450 questions, code and submit your solution .

2017-12-30

计算机网络

本书是当前世界上最为流行的计算机网络教科书之一,采用了作者独创的自顶向下的方法来讲授计算机网络的原理及其协议,即从应用层协议开始沿协议栈向下讲解,强调应用层范例和应用编程接口,使读者尽快进入每天使用的应用程序环境之中进行学习和“创造”。本书的讲解以因特网为例,学以致用;注重教学法,深入浅出地重点讲解计算机网络的基本原理。

2015-10-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除