
CC++Design
文章平均质量分 73
FreedomRoad~
专注于app底层/架构/算法/业务工作流程,记录进步的足迹和感悟。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
c++11新特性总结和boost库的使用
代码见:https://github.com/Jeromecen/cpp11study/tree/masterI、保持语言的稳定性和兼容性” 总结:主要是utf8字符串,虚函数override/final支持。 1、c++11宏和类型(考虑和c99兼容):STDC_HOSTED、STDC、__VA_ARGS__宏可以替代...、__cplusplus宏用于c和c++混编,非布尔值还可以判断原创 2017-06-12 07:01:24 · 4979 阅读 · 2 评论 -
编程范式简单总结
最常用的编程范式计算机科学中主流的:1.面向对象编程2.面向过程编程3.泛型编程工程业务框架中特有的:4. 事件驱动编程,一些VC,VB,Java框架中。5.并发编程,分布式编程。非常优秀但是很少用的编程思想:1.模板元编程(操作编译决策)模板元编程特性:早期(编译期)的类型检查:例如一个容器,如果人们想让它装A类对象,但后来又把兄弟B类原创 2015-08-15 13:41:13 · 7069 阅读 · 0 评论 -
递归函数的理解
前言:有很多复杂算法都包含了递归算法,特别是关于树形数据结构遍历的情景,所以正确深入理解递归算法是很有必要的。一、递归函数的基本概念递归函数机制理解:调用函数的静态和动态机制理解:调用函数和被调用函数虽然是同一个静态代码,但是运行时被函数运行的栈空间独立于调用函数的栈空间,调用点不同,函数状态栈地址也不同,所以运行时调用函数和被调用函数在代码副本还是数据副本上都是完全不同的,只有通过返回值和调用点进行联系。递归的调用形式:直接递归调用F1->F1,间接递归F1->F2->F1,很多情况下是直接递归原创 2015-04-28 08:32:11 · 2530 阅读 · 2 评论 -
浮点数表示和需要注意的问题
// 计算机底层数字转换: //1.10进制转换为n进制,正数除以进制,倒转取余(通过16进制和2进制转换更方便);小数乘以进制数,顺序取整。 //2.N进制数转换为10进制数,Ax(2^1) + Bx(2 ^0) + Cx(2^-1)数列形式表示,无论正数负数都一样。 //3.浮点数表示:符号位,指数位(0-127表示负数,(127-256)表示正数),尾数(去掉前原创 2015-01-14 23:56:53 · 8869 阅读 · 0 评论 -
使用高版本boost库导致xp下找不到GetTickCount64函数的解决方法
转载自:http://blog.youkuaiyun.com/keljony/article/details/44017775由于某些原因项目1中用到的boost库从boost_1_39升级到boost_1_55,升级完成后将程序放在xp下测试,提示找不到GetTickCount64()函数,整合工程却没有发现哪调用了此函数,最后在boost官网上早有人提到了这个问题。branches/rel转载 2015-05-13 20:25:41 · 1835 阅读 · 0 评论 -
C++技巧2内存管理和优秀的设计思想
1.智能指针智能指针的使用,auto_ptr赋值时候(显式直接赋值,隐式函数参数传递,返回值传递)都会丢失所有权,原来的指针被释放了,容易发生误用原来智能指针和智能指针所有权丢失的问题。建议使用boost的scope_ptr就够了或者使用auto_ptr仅是保护作用,需要赋值的需要用boost的shared_ptr.2.引用计数引用计数技巧:希望多个引用使用同一份内存数据,增加引用计数原创 2015-05-05 23:59:36 · 895 阅读 · 0 评论 -
简单的JPEG解码程序
转载自:http://blog.youkuaiyun.com/lpt19832003/article/details/1713708// JPGFile.cpp : Defines the entry point for the console application.//#include "stdafx.h"// simplejpeg.cpp : Defines the entry p转载 2015-04-30 08:20:05 · 2906 阅读 · 2 评论 -
Boost库编译详解
VS命令提示符窗口中先编译bjam编译工具,然后对需要的boost库进行编译。编译调试版本加 debug编译发布版本加 release编译静态链接库:link=static runtime-link=static编译动态库:link=shared runtime-link=shared示例:--t原创 2015-04-13 23:25:04 · 8321 阅读 · 0 评论 -
auto_ptr智能指针使用总结
总结: 1).auto_ptr只能作为常量来保护,建议使用boost库的scoped_ptr就足够了,不要使用auto_ptr进行赋值和容器管理。 2).对于需要对智能指针进行赋值\函数传递\容器管理\对象数组指针类型的操作,使用boost的shared_ptr,因为它使用了引用计数,否则使用auto_ptr只能对auto_ptr的引用或地址操作才是安全的。使用au原创 2015-04-17 23:06:44 · 763 阅读 · 0 评论 -
<<More Effective C++>>笔记C++技巧1
1.实现虚拟构造函数和虚拟非成员函数把真正的虚拟函数作为类的虚函数即可,其它构造或者非成员类封装下即可。2.实现单例模式单例模式,用类函数内的静态成员实现避免类的静态成员一开始初始化,不能控制初始化的时机。作为指针或者类函数内静态成员可以控制类的初始化时机。3.控制类的对象数量,不是很有必要一般应用中很少需要控制的,如果需要 控制,通过在构造函数中限定数量即原创 2015-04-24 21:27:57 · 762 阅读 · 0 评论 -
stl map 插入方式和特别需要注意的区别
map容器的插值方式和特别需要注意的区别:stl map键都是唯一的,如果插入相同的key, mapObj.insert不会覆盖原来的键值,mapObj[]会覆盖键值。需要不唯一的key用multimap。set的insert插入会不会覆盖,没有区别。测试代码:#include #include #include #include #include using原创 2015-08-15 18:54:13 · 6916 阅读 · 0 评论 -
STL 迭代器失效和运算符重载容易错误问题
1.一定要小心迭代器失效1) 容器本身是空的,使用迭代器前,需要检验迭代器是否有效。2) 容器本身增删失效,erase返回的是下一个迭代器,容器改变了插入删除了那么原来的迭代器就很容易失效。3)容器存放的数据增删,容器内尽量存放的是结构体,而不是指针,存放指针很容易导致那块内存删掉了而变成存放的是野指针了。2. STL结构体里面包含有 STL容器,那么不能使用memse原创 2015-08-15 19:10:34 · 1026 阅读 · 0 评论 -
C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结
因为原来C风格的暴力万能类型转换容易导致运行时出错,所以要引入分类更清晰提前发现错误的转换语法。对象的类型转换包含了对象的引用或指针。1.static_cast是编译器默认选项,但是没有动态检查所以类对象间非直线继承转换不支持(无关对象指针类型),C风格的转换确是可以的,所以并不是C风格转换的替代品。所以基本类型转换,类上行转换(类的下行转换有隐患),把其它类型转换为void*都是安全原创 2017-05-16 15:41:33 · 521 阅读 · 0 评论 -
C++ new/operator new/placement new浅析
总结:不要轻易的去重载new, operator new,placement new运算符,因为调用比较复杂(new操作符可隐式也可显式调用)且内部元素个数这些比较难处理,即使是在内存池技术中,而应该是用包装的方式用宏或者函数调用的方式来实现,效果比较好。new[],operator new[]数组的方式也不建议使用,用宏或者函数的方式来实现内存的申请初始化,析构释放比较好。1原创 2015-04-16 08:52:57 · 839 阅读 · 0 评论 -
C++ 内存分配(new,operator new)详解
转载自:http://blog.youkuaiyun.com/wudaijun/article/details/9273339本文主要讲述C++ new关键字和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用。一. new operator 和 operator newnew ope转载 2017-05-17 10:43:13 · 1095 阅读 · 0 评论 -
map/unordered_map原理和使用整理
map的内部实现是二叉平衡树(红黑树);hash_map内部是一个hash_table一般是由一个大vector,vector元素节点可挂接链表来解决冲突,来实现.hash_map其插入过程是:得到key通过hash函数得到hash值得到桶号(一般都为hash值对桶数求模)存放key和value在桶内。其取值过程是:得到key通过hash函数得到hash值得原创 2015-04-15 08:47:54 · 63579 阅读 · 9 评论 -
google c++ styles和华为C语言编程规范总结
一、要记得重构重要性和基本的设计原则高内聚低耦合MVC架构插件化微内核化架构,依赖倒置接口原则/接口隔离原则,开放关闭原则/里氏原则,迪米特法则/组合优先,单一职责原则。代码需要不断重构 架构分离MVC,接口提取,类的抽象,分解组合,函数提取去掉重复冗余,通信尽量集中简单。重复冗余,结构混乱,通信混乱需要消耗巨大资源和陷入泥潭漩涡需要时刻警惕和规范化和不断重构。函数简单只做一件事情,健壮可原创 2015-09-28 00:09:28 · 5963 阅读 · 0 评论 -
C++泛型编程思想方法总结
C++用模板来实现泛型编程,模板分为函数模板和类模板。基本概念:泛型编程范式GP:模板也叫参数类型多态化。在编译时期确定,相比面向对象的虚函数多态,能够有更高的效率。泛型编程是从一个抽象层面描述一种类型的算法,不管容器类型是什么,是一种不同于OOP的角度来抽象具体算法。C++0X目前对GP的支持的趋势来看,确实如此,auto/varadic templates这些特性的加入象征着C原创 2015-08-15 15:39:43 · 11151 阅读 · 2 评论 -
STL algorithm中的swap 函数使用
对自定义类型使用STL algorithm中的swap函数,会调用自定义的类型的拷贝构造函数一次,赋值函数两次;自定义类型中没有定义那么就会使用默认的拷贝构造函数和赋值函数。 如果是容器,那么会遍历容易进行赋值。STL 中swap源码:// TEMPLATE FUNCTION swap (from )template inline void swap(_Ty& _L原创 2015-08-15 17:58:02 · 6104 阅读 · 0 评论 -
const、volatile、mutable关键字
转载自:http://blog.youkuaiyun.com/wuliming_sc/article/details/3717017const关键字变量宏方面:const 修饰变量:常量非指针类型,非指针常量类型并没有什么区别。const修饰指针:常量指针:是指针不过指向的是常量可以进行p++操作不能进行*p操作;指针常量:是常量,不过有一个指向它地址的指针,可以进行*p操作,不可转载 2015-08-16 22:39:44 · 578 阅读 · 0 评论 -
STL 自定义结构体集合运算
STL容器的集合操作:1.二叉树类型的或者其它序列类型的容器可以将集合运算结果放置到vector中,vector可以resize下大小(string也可以resize)。2.自定义类型的结构体进行集合运算,那么需要重载operator 3.常用的集合操作1)交集 set_intersection2)并集 set_union3) 差集 set_difference差是原创 2015-08-15 19:50:42 · 2373 阅读 · 0 评论 -
2014百度校招笔试题之动态链接库&静态链接库详解
转载自:http://blog.youkuaiyun.com/longshengguoji/article/details/12206785静态库:都是编译时候加载整个静态库占用内存多,不能动态升级,运行时代码装载速度快,执行速度略比动态库快。动态库:分为静态调用和动态调用,静态调用程序开始运行时候加载所有需要用到的文件,启动慢点,调用方便。动态调用,程序运行起来以后才根据需要加载需要的函数,调用复杂转载 2015-04-14 08:50:15 · 1186 阅读 · 0 评论 -
字节字符和整数转换-大小端转换-结构体内存(文件)对齐规则之总结
1.char*,unsigned char*字节,char,unsigned char字符和整型的转换的理解char*,unsigned char*记录的就是二进制转换到的十六进制的字节码[整(整数补码(正整数还是原码负整数补码),浮点数IEEE74原码,字符编码原码),存放顺序是先入先存放的,超过一个字节就会区分大小端存放。char*,unsigned char*指针转换到char,un原创 2015-04-23 08:40:30 · 3697 阅读 · 0 评论 -
C++常量成员常量返回值详解
/*总结:1.常量数据成员,形式:const Type m_tData;1)常量数据成员,需要在构造函数列表中给出,构造函数中可以用常量赋值,也可以实例化的时候赋值。2)赋值函数中不能赋值,起到保护常量数据成员的作用,和友元作用相反。2.常量成员函数,形式:type funname(type1 arg1,type2 arg2,...) const1)常量成员函数,不能修原创 2015-03-15 17:26:37 · 3987 阅读 · 0 评论 -
异步事件回调机制原理探索
自定义的异步事件回调机制:可以在自己的应用程序中,先注册事件和事件对应的回调函数(回调函数可以是函数指针法,虚函数方法的方式);自己程序中每帧检测事件是否发生或者条件是否满足,满足的时候就进入回调函数。如果这样的检查是在同一个线程中那么就是同步的延迟调用,如果是在子线程中就是异步调用,但是这样的性能还是比较差的,除非不得以,否则还是用OS的异步回调机制性能高。OS层面的异步事件回调机制原创 2015-03-15 12:58:02 · 7596 阅读 · 2 评论 -
归并排序之CC++程序
//MergeSort.h#pragma oncevoid MergeArray(int a[], int first, int mid, int last, int temp[]);void MergeSortRecursion(int a[], int first, int last, int temp[]);bool MergeSort(int a[], int n);/原创 2014-10-14 22:50:52 · 708 阅读 · 0 评论 -
加快的冒泡排序之CC++程序
void BubbleSort(int a[], int nSize);void BubbleSort(int a[], int nSize){for(int i = 0; i {bool bFlag = true;for(int j = 0; j {if(a[j] > a[j + 1]){int temp = a[j];a[j] = a[j+1];原创 2014-10-14 23:14:25 · 1040 阅读 · 0 评论 -
this引出的上下行转换和类继承体系设计需要注意的问题
//总结:// this在软件框架或者游戏引擎中实现多态的重要作用:// 如果是子类的对象实体,那么this就是指子类对象实体,而不是父类。// this和上行转换(Node *pObj = new Sprite())一致:;//1.this指向的多态函数是调用子类的,虚函数内使用的是子类的成员(即使子类重定义了父类的成员)。//2.this指向的同名函数是调用父类的。//原创 2014-10-12 13:46:18 · 1068 阅读 · 0 评论 -
拷贝构造函数和赋值函数的区别
// 结论:// 1.函数参数中传递对象值或者函数返回对象值时,调用的都是拷贝构造函数。// 2. A objA = ObjB; // 调用的是拷贝构造函数(无论类还是结构体).// 3. A objC; objC = objA;// 调用的是赋值函数(无论类还是结构体).// 4.赋值函数可以删除之前的堆资源,拷贝构造函数不可以删除之前的堆资源.// 简单结论:拷贝构造函数在原创 2014-09-14 21:37:47 · 1452 阅读 · 0 评论 -
C++构造、析构函数和友元类小总结
/*假如一个人CA把感冒病毒传染给了朋友CB,用这件事写成C++小测试程序,复习下C++的友元,C++的构造和析构函数进行堆内存申请和释放。记得知识点:(1)类声明了一个友元函数或者友元类,目的是友元函数或者类可以通过该类的对象直接访问它的私有成员。否则可以通过组合,继承实现对该类的公有或者保护成员的访问。(2)构造函数中,如果要用C形式申请堆内存返回p,注意对p检查、赋初值、越界检测原创 2012-11-24 17:28:29 · 2324 阅读 · 0 评论 -
设计模式之代理模式
代理模式,#include #include using namespace std;typedef struct tagUserInfo{string m_strName;int m_nLevel;}UserInfo;class AbstractServer{public:virtual vector* GetServerUserInfo(原创 2014-09-21 10:16:30 · 714 阅读 · 0 评论 -
自己实现的简单Printf函数
#include #include void PrintStr(const char *pStr){while(*pStr != '\0')// 1.*pStr != '\0'{putchar(*pStr);pStr++;}}void MyPrintf(const char *pFormat, ...){va_list args;va_s原创 2014-09-21 00:15:15 · 1366 阅读 · 0 评论 -
对左值和右值的理解
来自:http://blog.youkuaiyun.com/ccskyer/article/details/6097999今天在优快云上看到一个关于左值和右值讨论贴,顺便说下自己的理解左值:必须要有明确的名字来代表这个值;右值:如果没有明确的名字来代表这个值,那么这个就是只能是右值;举例:int a=1;a,a=2,++a都可以是左值;而1,a++就不能作为左值,只能是右转载 2015-03-16 08:15:28 · 1135 阅读 · 0 评论 -
位操作基础篇之位操作全面总结
位操作基础篇之位操作全面总结分类: C/C++/C#基础2012-03-19 09:34 42471人阅读 评论(128) 收藏 举报CC++位操作判断奇偶-交换两数-变换符号求绝对值-位操作压缩空间位操作趣味应用位操作笔试面试目录(?)[+]Title: 位操作基础篇之位操作全面总结Author: MoreWindowsE-mail:转载 2015-03-05 07:57:18 · 830 阅读 · 0 评论 -
结构体内存对齐规则总结-整体单个排列/成员之间没有边界只有最后的填充/最后是最大类型整数倍
int _tmain(int argc, _TCHAR* argv[]){ // 结构体读取网络和文件数据: // 结构体类型解析数据,例如从文件中直接读取到结构体中(因为写入和读取二进制时候都是相同的结构体内存对齐模式,所以字节赋值和转换值会成功) // 1.结构体内存对齐之基本原则: // 结构体内存对齐之成员和序列: // 1原创 2015-01-21 23:43:29 · 1414 阅读 · 0 评论 -
程序设计性能优化整理(二)
1.函数返回值的优化 不能不返回(非类内部成员),不能返回指针(无论是从函数参数还是返回值),也不能返回引用的函数(临时对象的引用会丢掉,除非是类本身)。那么只能返回对象,返回对象也是可以优化的,首先减少类内局部对象的构造,第二返回匿名对象编译器可以帮助优化不生成临时对象。Number operator +(const Number &num1, const Number &num2)原创 2015-04-22 22:58:05 · 860 阅读 · 0 评论 -
程序设计性能优化整理(一)
很多时候性能问题都不是来自语言本身,编译器,网络或者IO的。凭猜想是很难得到答案的。需要用profile性能分析工具来定位问题。很多时候是来自系统的内存开销和CPU计算导致的性能问题。性能问题100%来自于自己项目的代码,百分之10-20%的代码消耗掉了80-90%的性能。思想方法一:lazy evaluation(懒惰计算法)-当系统CPU内存紧张时候方法:减少避开延迟计算,原创 2015-04-19 09:51:12 · 1380 阅读 · 0 评论 -
C++运算符及其重载问题
1.要谨慎的处理类型转换-用显式的类型转换代替隐性转换1)不要重载类型转换运算符,例如()符号,而是使用显性的函数进行类型转换,比如c_str(),asDouble().2) 单个参数的构造函数需要注意,小心隐性的运算转换,需要用explicit修饰进行显性的转换,不支持explicit可以用内建类,内建类表明外部类和内部类是紧密联系的,一种组合关系生命期一致,构造时候类型递推的转原创 2015-04-18 08:11:53 · 810 阅读 · 0 评论 -
C++构造函数和析构函数异常
0.构造函数需要安全的构造,那么减少使用全局对象,否则构造函数中的值,或者数据成员动态改变的值很可能因为依赖的资源没有创建好,而导致构造失败。所以构造函数尽量使用单例指针来代替全局对象。1.如果构造函数中还是因为资源问题而失败,那么需要使用智能指针来保护,对构造函数中的每个指针对象都要使用智能指针保护起来。非指针的STL容器,可以在对象生命期结束后自动析构,智能指针就是类似这样的保原创 2015-04-18 08:11:43 · 1143 阅读 · 0 评论 -
C++异常处理的理解
1.异常的基本概念和选择异常处理try语句会导致比较大的开销,异常规范也会导致比较多的开销(每个都比自己原来大概增大5%-10%左右,速度也减慢原来同等的比例,原因是需要额外的内存和计算来详细记录执行过程中状态)。因此选择使用异常处理需要谨慎。异常处理异于函数调用的地方是函数调用会保留现场,原地返回;异常却是抛出来以后就不会再回来。因此使用异常需要很了解异常。2.抛出值原创 2015-04-18 08:15:40 · 1087 阅读 · 0 评论