![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
basic knowledge of C++
okzuhedu
每一份血汗,都增加一份积累
展开
-
#define和const、inline使用的优劣
C++而言,对象的概念深入人心,你想控制所有信息的调用和实现。分析一下他们的优缺点:我不太喜欢使用#define定义函数是因为,本人底子薄,有时候还是需要去看看堆栈,像宏定义函数实现,不能直接调试,实在没办法还需要看看汇编。宏定义不注重作用域,const定义常量有数据类型,编译器可以对其进行类型安全检查,数据可以分配数据空间,宏不会分配空间。最主要的是不能调试,看不到实现过程,小白原创 2018-02-25 00:08:29 · 246 阅读 · 0 评论 -
后台开发面试
前段时间专心面过腾讯,经过了N轮的技术面,结果还是挂了,但没挂在技术面,比较欣慰,回来之后写一点总结,以供有梦想进入腾讯做后台服务器开发的同学参考,本文章为胡成精心总结,胡成原创,copy和转载请通知。ps:()之内的文字由作者点评,非面试题文字。linux和os:netstat tcpdump ipcs ipcrm (如果这四个命令没听说过或者不能熟练使用,基本上可以回家,通过的转载 2015-03-13 10:32:31 · 515 阅读 · 1 评论 -
beginthread和beginthreadex的使用方法
beginthread和beginthreadex的使用方法建立一个线程。unsigned long beginthread(void(cdecl *startaddress)(void*),unsigned stacksize, void *arglist);unsigne dlong beginthreadex(void *security,unsigned转载 2015-03-02 15:19:48 · 1464 阅读 · 0 评论 -
buffers和cache的区别
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。 缓存(cache)实际并不是缓冲文件的,而是缓冲块的,块是磁盘I/O操作的最小单元(在Linux中,它们通常是1KB)。这样,目录、超级块、其它文件系统原创 2014-06-01 10:52:32 · 2527 阅读 · 0 评论 -
LeakDiag使用手记
原文地址:http://www.cppblog.com/sandy/archive/2008/08/18/59260.htmlLeakDiag是微软一款检测memory leak的工具,使用比较简单首先去下载一个ftp://ftp.microsoft.com/PSS/Tools/Developer%20Support%20Tools/LeakDiag/安装好,默认是在c转载 2014-05-28 23:03:55 · 891 阅读 · 0 评论 -
dll应用,传说中的万恶的智能指针
最近一个小实现模块完工,准备接入原创 2014-06-09 23:59:24 · 1136 阅读 · 0 评论 -
error C2377: “resolver”: 重定义;typedef 不能由任何其他符号重载
“identifier”: 重定义;typedef 不能由任何其他符号重载typedef 标识符被重新定义。错误的示例:[cpp] view plaincopyprint?typedef int i; int i; // C2377 int j; // OK 也就是说typedef定义的类型最好不要再用为转载 2014-05-25 21:17:12 · 3713 阅读 · 0 评论 -
boost库应用(二)
两个简单例子,一个是线程,一个是定时器。原创 2014-05-25 21:43:35 · 623 阅读 · 0 评论 -
warning 的消除方法
一般来说,警告没有什么影响,但是太多的warning看着都眼花,原创 2014-06-27 23:41:26 · 2453 阅读 · 0 评论 -
关于STL中的erase操作
vector容器使用erase删除操作不仅huierase迭代器不仅使所有指向被删元素的迭代器失效,而且使被 删元素之后的所有迭代器失效,所以不能使用erase(iter++)的方式,但是erase的返回值为下一个有效的迭代器,所以原创 2014-06-08 22:02:05 · 584 阅读 · 0 评论 -
宏应用
宏只是是一种预编译命令,都是#开始。格式#define TEST xxx#undef TEST结束。注意事项 宏只是替换程序中的代码,所以每一个参数都需要用();比如#define ADD(a,b) (a + b)运行ADD(1-2,2-1) 编译替换就成为了1-2+2-1,加法还好,如果是乘法,就会变成1-2*2-1,所以一定要给参数加()保护。原创 2015-03-31 22:29:14 · 441 阅读 · 0 评论 -
消除无害警告!
#pragma warning(push)是保存当前的编译器警告状态;#pragma warning(pop)是恢复原先的警告状态。例如:#pragma warning( push )#pragma warning( disable : 4705 )#pragma warning( disable : 4706 )#pragma warning( disable : 470原创 2015-11-10 13:28:16 · 528 阅读 · 0 评论 -
#ifdef条件选择应用!
最近要改后台服务器,因为想着需要三合一程序,所以需要三个宏交替使用。原本用宏定义包起来的代码类似如下:[cpp] view plain copy print?#ifdef A //... #endif // A 现在要加入一个宏定义 B,实现类似这样的条件判断(显然实际上这样是不行的):[cpp]转载 2016-03-24 17:38:05 · 770 阅读 · 0 评论 -
函数数组
对于多条件判断出来,简单明了的是使用swich接口,但是判断条件太多,我们写的代码就会很冗长。不利于解读。执行效率就也会有影响。类似的游戏服务器里面的gateserver,考虑服务器要链接无数客户端,对应每个实现,我们使用map来一一对应吗,虽然map的查找比较快,但是非常消耗资源,密度大。所以,我们可以考虑使用数组,这样简单明了,而且不需要查找,直接下坐标获取。速度就不是一个层次。原创 2017-07-31 23:03:52 · 239 阅读 · 0 评论 -
C++封装一个时间库
.h文件是这样的#pragma once#include #include int DayOfTheWeek(int nYear, int nMonth, int nDay);//等待时间超时;int WaitTimeOut(unsigned int nMilliseconds);class CMyLocalTime{public: CMyLocalTime(); ~C原创 2016-11-30 18:17:54 · 635 阅读 · 1 评论 -
C++中星期几计算公式
蔡勒公式(Zeller):是一个计算星期的公式。随便给一个日期,就可以使用这个公式推算出事星期几。公式如下:Weeks = [C/4] - 2C + y + [y/4] + [13*(M +1)/5] + d -1;或者是Weeks = y + [y/4] + [c/4] - 2c + [26(m + 1)/10] + d - 1;公式中的符号含义如下:Weeks:星期总数;用原创 2016-11-30 18:12:19 · 6783 阅读 · 1 评论 -
STL的多线程安全问题
1) stl的线程安全.说一些关于stl容器的线程安全相关的话题。一般说来,stl对于多线程的支持仅限于下列两点:(貌似Effective STL中有描述)1.多个读取者是安全的。即多个线程可以同时读取一个容器中的内容。 即此时多个线程调用 容器的不涉及到写的接口都可以 eg find, begin, end 等.2.对不同容器的多个写入者是安全的。即多个线程对不同容器的转载 2016-07-07 20:32:47 · 539 阅读 · 0 评论 -
malloc/free new/delete 区分
简单点来说:malloc/free 是C语言函数, new/delete是C++运算符.malloc/free只是分配和回收内存空间,new/delete自动计算分配内存空间大小,然后调用对象构造函数。delete时调用析构函数。原创 2016-07-07 20:19:35 · 266 阅读 · 0 评论 -
vc++获取系统时间,几种方法!
VC++获取当前系统时间日期 GetSystemTime()函数的用法 呵呵 获取时间 函数 每次都是一个 头疼的问题 , 写法也是 千变万化 等于我这总不记得一个函数用法的 人 天天写程序 就是百度 所以效率 低 后来 发现如果 用过的东西 都记下来 该多好啊 。 这样 就好找多了 来看看 vc 中 获取 系统时间 操作的 函数用法大全把转载 2016-06-20 11:27:42 · 2064 阅读 · 0 评论 -
如何根据基类指针来判断这个基类是由那个子类转换而来!
在C++中如果想在运行而不是在编译的过程中获得对象的具体的类型,那么就必须要用到虚函数。其实虚函数的出现就可以理解为需要在运行的时候知道对象的具体类型,反之亦然。既然用到了虚函数,那么就可以实用dynamic_cast代码如下:[cpp] view plain copy#include using namespace st转载 2016-07-11 14:21:55 · 1494 阅读 · 0 评论 -
关于内存问题提醒!结构体+protobuf做协议体发送!
内存的三种分配方式:1. 从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。2. 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。3. 在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指原创 2016-06-12 19:28:43 · 3316 阅读 · 0 评论 -
static_cast和reinterpret_cast
[cpp] view plain copy static_cast和reinterpret_cast揭秘 收藏 本文讨论static_castreinterpret_cast reinterpret_cast可以转换任意一个32bit整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,威力转载 2016-03-25 13:44:13 · 313 阅读 · 0 评论 -
关于未安装vc情况下运行执行程序方法
一般情况下,在debug中生成的执行程序,本机上都原创 2014-06-01 22:57:37 · 809 阅读 · 0 评论 -
简单缓存处理---UDT
UDT安全传输文件虽然传输速度等方面使用很方便,但是还是有一个重要的问题,就是原创 2014-05-18 23:28:27 · 875 阅读 · 0 评论 -
关于一些辅助库singleton
数学与逻辑学中,singleton定义为“有且仅有一个元素的集合”。单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”class Singleton{public:Singleton();static Singleton* GetSingleton(){if(NULL == m_pSi原创 2014-03-31 22:14:02 · 626 阅读 · 0 评论 -
小心得:处理两个头文件互调,死循环情况(将文件之间的编译依赖关系降至最低)
本来没这么关注这个问题,但是今天应用两个类之间互调,发现出现死循环显现,就是传说中的泥中有我我中有你,都是预编译搞的鬼,一旦加入#include然后两个类就是开始我把你的源代码复制过来,你又把我得源代码复制过来,当然vc不会这么干了,他会给报错,说其中一个类为定义。解决这个问题之前,要先说一下这个声明和定义分开的问题,就是实现和接口分离问题,这是我的简单理解,欢迎提意见。简单来说就是类原创 2013-12-14 00:33:01 · 859 阅读 · 0 评论 -
关于printf的几个C语言库函数
一、_vsnprintf,c语言库函数之一,属于可变参数。用于向字符串中打印数据、数据格式用户自定义。函数原型: int vsnprintf(char* str,size_t size,const char* format,va_list ap);参数说明: char* str[out] ,把生成的格式化的字符串放入此变量。 size_t [i原创 2013-11-30 18:09:31 · 992 阅读 · 0 评论 -
关于以string类型的容器,容器中字符串的操作
最近总是遇到string类型的操作,今天把我掌握的方法都先记录下来。直接进主题吧!常常用到Vector ,list ,如何遍历里面的类型呢,看过STL的朋友,都会用迭代器。如下://同一都支持迭代器操作,这里只讲一个关于string操作vector strVec;strVec.push_back("this is a test!");strVec.push_back("T原创 2013-11-30 14:49:22 · 1842 阅读 · 0 评论 -
STL中map容器的操作
MAP是SLT中的一个容器,是关联式容器。它提供一对一的数据处理能力,其中第一个数据称为关键字,每个关键字只能在map中出现一次,第二个数据代表关键字的值。主要针对的是处理一对一的数据,MAP内部是自建一棵红黑树(一种非严格意义上的平衡二叉树),具有数据自动排序功能,所以MAP内部所有数据是有顺序的,基本是从小到大。 MAP的默认构造函数:Map(const map& m);原创 2013-11-29 13:11:51 · 831 阅读 · 0 评论 -
关于利用Tcp库来实现文件传输
文件传输主要是学习文件处理的windows API函数、数据结构操作和 string操作。首先应用库来建立一个服务器和一个客户端,都是单线程。服务器说明:建立一个结构体tTransFilestruct tTransFile{ int nLen; int nIdx; char szFileName[255]; UINT32 uFileSize;原创 2013-11-28 21:50:01 · 1046 阅读 · 0 评论 -
数组名和取数组名地址的区别
main(){int a[5]={1,2,3,4,5};int *ptr=(int *)(&a+1);printf(“%d,%d”,*(a+1),*(ptr-1));}写出上面打印的结果。*(a+1)大家都可以知道他的结果,就是Array的第二个成员的值,那&a+1代表什么呢!int nData[2] = { 1,2 };printf("nDat原创 2013-11-24 21:22:10 · 846 阅读 · 0 评论 -
About memset应用、memcpy和strcpy比较
把最近应用比较多的关于string的操作函数做一下总结。 一、首先说一下memset,在很多类和结构体中都会用到它来做初始化,比较好用。 函数原型:void memset(void* s,char ch,size_t n) 函数解释:把s中的前n个字节用ch替换并且返回s 作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快的方法。原创 2013-11-22 09:34:12 · 822 阅读 · 0 评论 -
c语言中的printf实现
C中的可变参数研究 一. 何谓可变参数 int printf( const char* format, ...); 这是使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用”…”表示). 而我们又可以用各种方式来调用printf,如:printf( "%d ",value); printf(转载 2013-11-21 20:33:01 · 803 阅读 · 0 评论 -
c++ try_catch throw
原文地址使用throw抛出异常本人节选自《21天学通C++》一书 抛出异常(也称为抛弃异常)即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:throw 表达式; 如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处转载 2013-11-21 20:25:57 · 646 阅读 · 0 评论 -
最近新学的新技术,指针的又一应用
函数指针:就是通过指向函数的指针间接调用函数,函数指针可以完成对参数类型、参数顺序、返回值。外面调用函数返回的就是这个指针或者操作。简单来说就是函数指针一旦应用就会返回原函数操作,一般都是返回至指针的函数。如果一些函数的外表一样,比如函数形式、参数顺序、参数类型、返回类型。差不多就这几种吧!那么就可以应用函数的指针进行封装,果然是指针带来的扩展空间!这就成了多态的一种表现方式。typede原创 2013-12-14 11:41:52 · 503 阅读 · 0 评论 -
关于容器操作
容器是编程的基本工具之一,基本上所以场合都要使用!搞清楚他们的使用复杂度,正确使用合适的容器,更加有利于优化程序。vector:典型的序列容器,C++标准严格要求此容器的实现内存必须是连续的,唯一可以和标准C兼容的STL容器,任意元素的读取、修改具有常数事件复杂度,在序列尾部进行插入、删除是常数事件复杂度,但在序列的头部插入、删除的时间复杂度是O(n),可以在任何位置插入新元素,有随机访问的功原创 2014-01-01 15:49:51 · 764 阅读 · 0 评论 -
TCP超时重传算法
一直以来都是看 《 TCP/IP 协议》这本书来理解 TCP 的一些概念,但发现讲解的不是很清晰(或者是翻译质量的问题)。最近读Tanenbaum 的 《计算机网络第4版》,惊喜的发现这本书对 TCP 的一些概念做了非常清晰易懂的讲解,心头的一些疑问得到了解答。现整理一下我的理解,以加深记忆。 ¨ 重传定时器:TCP 必须维护一个重传定时器,以进行超时重传 ¨转载 2014-01-02 21:06:08 · 1252 阅读 · 1 评论 -
类的函数指针(UDP下载中的协议处理对象)
枚举,处理协议的时候还是不错的!emum ePERSONAL_PROTOCOL { },内部直接写入你设计的协议类型,最后一个是协议个数。 eClient_Head_Count。内部建立协议处理对象,Handle_Pack_Mgr .内部定义 私有变量处 typedef void (HandlePackMgr:: *PACKFUNC)(void* pData)具体参数自己设置原创 2014-03-31 21:33:47 · 534 阅读 · 0 评论 -
About Log
最近学习的关于文件日志的编写。里面涉及到的主要是文件操作、目录创建,还有就是重构和STL字符串string操作应用。 具体思想是单线程写入(保证安全写入)+管理,管理分管目录创建、文件建立。单线程维护数据安全,管理负责建立目录、创建文件和WriteFile。 考虑到程序中应用此Log,最少需要用到LOG_MAIN.log、LOG_DEBUG.log、LOG_ERRO原创 2013-11-21 20:21:02 · 1092 阅读 · 0 评论 -
memcpy memmove区别和实现
文章来源:http://www.cnblogs.com/kekec/archive/2011/07/22/2114107.htmlmemcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。memmove的处理措施:(1)当源内存的首转载 2014-02-13 21:32:28 · 527 阅读 · 0 评论