C/C++
suyinfan
虽然技术还很差,但始终怀揣着梦想
展开
-
设计模式-外观模式
外观模式定义UML类图结果图最少知识原则:优点缺点定义外观模式提供了一个统一的接口,用来访问子系统种的一群接口。外观定义了一个高层接口,让子系统更容易使用。有时候我们创建一个接口简化而统一的类,用来包装子系统种的一个或多个复杂的类。它允许我们让客户和子系统之间避免紧耦合。UML类图上图中各个部分组成如下:外观角色类(Facade):客户端可以调用这个角色的方法。此角色知晓相关的(一...原创 2019-03-23 19:09:00 · 236 阅读 · 0 评论 -
僵尸进程与孤儿进程
1.僵尸进程在父进程执行wait()之前,其子进程就已终止, 即使子进程终止,系统也允许父进程在以后的某个时刻去执行wait(),以确定子进程是如何终止。内核通过将子进程转为僵尸进程,以释放其占用的系统资源,供其他进程使用,该进程唯一保留的是系统PCB中的一条记录,其中包含了子进程的ID,终止状态,和资源使用的数据。当父进程再次调用wait(),内核进程表中将删除该记录,如果父进程终止,ini...原创 2018-04-06 14:00:02 · 134 阅读 · 0 评论 -
c++继承和组合的区别
转自:https://blog.csdn.net/caoyan_12727/article/details/52337297类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。通过继承建立了派生类与基类的关系,它是一种 “是(is a)”的关系,如“白猫是猫”,“黑人是人”,派生类是基类的具体化实现,是基类中的一 种。通过组合建立了成员类与组合类...转载 2018-03-22 22:00:39 · 237 阅读 · 0 评论 -
eclipse+cygwin设置c++11编译环境
1、设置环境变量Project->Properties->C++ General->Pahts and Symbols->Symbols(选项卡)2、Project->Properties->C/C++ Build > Settings > GCC C++ Compiler > Miscellaneous > other flages ,在原来的基础上添原创 2017-11-26 11:07:19 · 932 阅读 · 0 评论 -
set容器的一些用法
set集合容器:实现了红黑树的平衡二叉检索树的数据结构,插入元素时,它会自动调整二叉树的排列,把元素放到适当的位置,以保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值;另外,还得保证根节点左子树的高度与右子树高度相等。平衡二叉检索树使用中序遍历算法,检索效率高于vector、deque和list等容器,另外使用中序遍历可将键值按照从小到大遍历出来。构造set集合主要目的是为了原创 2017-10-27 18:30:41 · 439 阅读 · 0 评论 -
new操作符不分配内存,只调用构造函数
问题:c++中的new操作符 通常完成两个工作 分配内存及调用相应的构造出世核函数。1)如何让new操作符不分配内存,只调用构造函数?2) 这样的用法有什么用?解答:(要求new显式调用构造函数,但不分配内存。)题目要求不能生成内存 还要调用构造函数 说明这个类里面没有对内部操作 但可以对外部操作 比如static的数摘录:如果我是用new分配对象的转载 2017-10-21 14:38:56 · 489 阅读 · 0 评论 -
浅析C语言的非局部跳转:setjmp和longjmp
转自:http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.htmlC语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转(通常情况下,很多人都建议不要使用goto语句,因为采用goto语句后,代码维护工作量加大)。另外,C语言标准中还提供一种非局部跳转“no-local goto”,其通过标准库C标准库 < setjmp.转载 2017-09-02 16:32:43 · 257 阅读 · 0 评论 -
两个线程轮流对一个全局变量执行加1操作并且打印
两个线程轮流对一个全局变量执行加1操作并且打印最近在看多线程编程,想起以前有个电话面试出的题目,今天就写了下,主要是利用互斥变量和条件变量,主线程先执行,然后通知子线程执行,轮流执行++操作,并且打印,代码如下:#include <stdio.h>#include <stdlib.h>#include <pthread.h>using nam...原创 2018-04-30 23:12:01 · 4489 阅读 · 0 评论 -
memcpy内存重叠的解决及其实现
void * memcpy(void * destination, const void * source, size_t num);当源字节串和目标字节串重叠是,bcopy能够正确处理,但是memcpy的操作结果不得而知,这种情况必须改用ANSI C的memmove函数[网络编程]。故该函数实现过程中要考虑src 和dst是否有重叠的情况。 内存重叠:拷贝的目的地址在源地址范围内。所谓内存...原创 2018-05-01 22:18:24 · 5269 阅读 · 0 评论 -
环形无锁队列
先贴代码,后面再分析#include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;iostream&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;#include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;pthread.h&amp;amp;amp;amp;amp原创 2018-05-11 01:26:06 · 4368 阅读 · 3 评论 -
设计模式-适配器模式
适配器模式定义代码结果实现要点:使用场景:定义将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。适配器模式分为对象适配器和类 适配器两种。UML图如下所示:代码Adapter.h#ifndef _ADAPTER_H_#define _ADAPTER_H_#include <memory>#include <iostream&...原创 2019-03-21 22:41:35 · 173 阅读 · 0 评论 -
Dijkstra算法
图中从某个源点到其余各个顶点的最短路径,可以采用Dijkstra算法求解,具体思想就是对于图中n个顶点,从顶点v开始求解其到其余顶点vi的最短路径,首先引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从v到vi的路径长度,同时如果存在一个集合S,表示每次找到vi都会加入到集合S中,再次求解n-1个顶点,可以借用S中的顶点作为跳板得到vi的最短路径.代码如下:#include &amp;lt...原创 2018-07-10 00:01:31 · 341 阅读 · 0 评论 -
关于pragma pack,__attribute__(packed)
转自https://blog.csdn.net/zhangxiong2532/article/details/50826917 程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏 蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。例如我们设置结构体的对齐方式:struct student{ int age; char c...转载 2018-06-29 15:47:01 · 1018 阅读 · 0 评论 -
斐波那契数列简单递归和动态规划的实现
一、简单递归的实现int f1(int n){ if (n == 0) { return 0; } if (n == 1) { return 1; } return f(n - 1) + f(n - 2);}但是,这个函数去执行的时候,会发现非常的慢。那是什么原因呢? 我们仔细观察一下,每一次递归...原创 2018-06-10 11:57:22 · 1022 阅读 · 0 评论 -
swap函数不借助临时变量的几种求法
最近看到swap的几种求法,所以总结下,便于以后查阅,其实思想差不多,都没有用到临时变量,“这种方式并没有性能上的优势,它仅仅是一个智力游戏”[深入理解计算机系统]void swap1(int &a, int &b){ a = a + b; b = a - b; a = a - b;}void swap2(int &a, int &...原创 2018-06-09 23:22:03 · 323 阅读 · 0 评论 -
C++进程虚拟内存模型
看到一些博客,关于C++进程内存模型,感觉好多都是错的,这里稍微总结下,便于以后查阅1.C进程虚拟内存模型栈,堆,初始化数据段(初始化的全局和静态变量),初始化数据段(又称bbs,未初始化的全局变量和静态变量),文本段(包含了进程运行的程序机器语言指令,具有只读性),见下图:2.C++进程虚拟内存模型栈,堆(malloc(好几个函数,见linux/Unix系统编程手册)申请和fre...原创 2018-06-16 23:59:01 · 2638 阅读 · 0 评论 -
C++ 虚函数表 存在哪
转自这里写链接内容 C++通过虚函数实现多态。那么虚函数表具体保存在哪?是每一个对象都有虚函数表,还是每一类有虚函数表?让我们通过代码分析一下。代码运行在Windows平台,使用Visual Studio2010编译。 虚函数基础知识C++中,一个类存在虚函数,那么编译器就会为这个类生成一个虚函数表,在虚函数表里存放的是这个类所有虚函数的地址。当生成类对象的时候,编译器会自动的将类对象的前...转载 2018-06-09 17:28:00 · 2405 阅读 · 1 评论 -
IO多路复用之select函数详解
select优点1)select()的可移植性更好,在某些Unix系统上不支持poll() 2)select() 对于超时值提供了更好的精度:微秒,而poll是毫秒。select缺点 1) 单个进程可监视的fd数量被限制。 2) 每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大 同时每次调用select都需要在内核遍历传递进来的所有fd,...原创 2018-05-04 22:57:54 · 666 阅读 · 0 评论 -
unary_function和binay_function
一、unary_function详解unary_function可以作为一个一元函数对象的基类,它只定义了参数和返回值的类型,本身并不重载()操作符,这个任务应该交由派生类去完成。其定义如下:template <class Arg, Class Result>struct unary_function{ typedef Arg argument_type; typedef Res原创 2017-09-09 18:52:16 · 635 阅读 · 0 评论 -
将整型ip转为点分十进制
通过将ip地址以整型16进制打出来,可以得到一些信息,比如192.168.251.10为C0A8FB0A,它的Uint32是-1062667510;可以采用移位等方式将整型ip转换为点分十进制字串具体实现程序如下:/* * main.cpp * * Created on: 2017年8月21日 * Author: */#include #include #i原创 2017-08-21 10:32:01 · 5087 阅读 · 0 评论 -
利用lua-intf来调用C++函数
利用lua-intf来调用C++函数这里主要是在windows利用VS2015完成,首先是配置lua环境,包含lua的头文件,连接器里面链接lua的静态库,然后就是包含lua-intf的代码,具体如下表需要注意的是lua-intf_d6f17a是一个包含lua-intf的目录。lua-intf的代码在github上可以下载:https://github.com/Stev原创 2017-07-18 09:43:22 · 2294 阅读 · 0 评论 -
windows下Eclipse C++环境搭建
转自:http://note.youdao.com/share/index.html?id=622badec17a154d34d6a7d1e39a4980d&type=note&from=singlemessage#/根据自己的实践,记录了Eclipse C++环境搭建的步骤,以备不时之需。主要分为以下三个步骤:1,安装jre下载jre:http://www.java.com/en/d原创 2017-07-16 11:04:52 · 3355 阅读 · 1 评论 -
do{...}while(0)
1. 帮助定义复杂的宏以避免错误举例来说,假设你需要定义这样一个宏:#define DOSOMETHING() foo1(); foo2();这个宏的本意是,当调用DOSOMETHING()时,函数foo1()和foo2()都会被调用。但是如果你在调用的时候这么写:if(a>0) DOSOMETHING();因为宏在预处理的时候会直接被展开原创 2017-02-07 14:30:28 · 246 阅读 · 0 评论 -
游戏中使用LUA脚本语言的简介
我们知道脚本语言是解除硬编码,防止重编译的利器,可以这样说,任何大型游戏都有自己的脚本系统。想要做出一款精品游戏,脚本语言也是我们需要掌握和运用的。较流行的脚本语言有Python,LUA,Ruby等。LUA有着轻量,高效,接口干净等特点,学起来很快,风靡全球的《魔兽争霸3:冰封王座》就是采用的LUA脚本语言。以下的内容非我原创,前几天转载 2017-01-02 15:20:55 · 732 阅读 · 0 评论 -
百度一道笔试题
百度一道笔试题原创 2016-07-04 20:24:30 · 1319 阅读 · 0 评论 -
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一转载 2016-06-06 18:25:12 · 314 阅读 · 0 评论 -
指针常量和指向常量的指针
const; 指针原创 2016-05-12 14:20:20 · 295 阅读 · 0 评论 -
安装protobuf时遇到的部分问题
安装protobuf时遇到的部分问题 由于demo的缘故,需要学习protobuf,关于protobuf的概念,就不多描述了,之后会重点介绍,本节主要是在安装protobuf时遇到的一些问题的总结与解决的手段,以便之后的温习。根据http://doc.oschina.net/grpc?t=58008中的介绍,首先下载源码:git clone https://github.com/pa原创 2017-07-09 14:58:32 · 8612 阅读 · 4 评论 -
使用eclipse+cygwin来编译jsoncpp
使用eclipse+cygwin来编译jsoncpp由于demo需要使用json来定义协议,这里我们使用了jsoncpp这个库,然后下载jsoncpp这个源码,由于本人习惯使用eclipse+cygwin来作为开发平台,Cygwin是一个模拟unix的编译器,可以利用其来在windows做开发可以实现代码的跨平台。进入源码包,查看里面的readme文件,发现并没有cygwin平台的编译方式原创 2017-08-09 10:14:36 · 581 阅读 · 0 评论 -
将十进制ip地址转化为字符串点分十进制ip地址
将十进制ip地址转化为字符串点分十进制ip地址在使用linux下udp的socket时,发现服务端不需要连接客户端,并且 ,每次接收数据时,都需要预先定义一个变量来保存发送数据端(客户端)ip地址,其中系统调用里面的ip地址是一个入参:#include ssize_t recvfrom(int sockfd, void *buff, size_t lenght, int flags,原创 2017-08-11 22:49:48 · 4960 阅读 · 0 评论 -
一种采用指针的指针的方式的建立链表的方法
最近在看posix多线程程序设计,第四章中流水线的例子中,建立链表的方法比较独特,之前没看到过,还是自己代码写得少。例子如下代码int pipe_index;stage_t **link = &pipe->head, *new_stage, *stage;int status; status = pthread_mutex_init (&pipe->mutex, NULL);原创 2017-08-21 22:08:13 · 334 阅读 · 0 评论 -
采用eclipse+cygwin生成的.exe文件点击一闪而过的问题
出现这个问题很奇怪,因为eclipse上点击执行按钮,程序是可以跑起来的,而点击Debug目录下的.exe文件却不行,然后开始注释代码逐一排查,返现是读取配置文件的路径问题,这里我写成了linux下的路径,所以cygwin是可以识别,因此eclipse可以跑起来。生成的.exe读取还是以windows路径,所以读取不到路径,故一闪而过。原创 2017-08-22 09:42:51 · 805 阅读 · 0 评论 -
将C++的std::string类型变量赋值给char类型数组
解决方法如下: char buf[2048];std::string sendMsg;strcpy(buf,sendMsg.c_str());原创 2017-08-14 16:43:48 · 15582 阅读 · 0 评论 -
利用jsoncpp接口来实现json字串的序列化与反序列化的C++封装类
利用jsoncpp接口来实现json字串的序列化与反序列化的C++封装类最近在使用jsoncpp的库,json的概念就不多说了,这里主要是解决利用jsoncpp库提供的接口来实现满足较多类型的的json字串序列化和反序列化的封装类,通过学习之前的文章,其地址如下http://blog.csdn.net/tragicguy/article/details/9150569http://原创 2017-08-13 15:10:14 · 4350 阅读 · 4 评论 -
error while loading shared libraries: xxx.so.x" 报错与解决
error while loading shared libraries: libevent_pthreads-2.0.so.5: cannot open shared object file: No such file or directory今天在执行一代码时,出现了该错误代码如下#include#include#include#include#include原创 2017-02-13 17:52:02 · 423 阅读 · 0 评论 -
条件变量虚假唤醒
Linux中帮助中提到的:在多核处理器下,pthread_cond_signal可能会激活多于一个线程(阻塞在条件变量上的线程)。 On a multi-processor, it may be impossible for an implementation of pthread_cond_signal() to avoid the unblocking of more than one t原创 2017-08-19 12:02:26 · 565 阅读 · 0 评论 -
C++中std::stringstream类型对象如何清除
由于需要循环向流中写入数据,以此来拼成一个需要的字串,且需要多次使用。在这里的需求下,自己想当然的以为是该类中也有clear()的成员函数,结果发现,并不行,也无法清除其中的已经存的数据,造成了字串拼接过多的错误,解决方法如下:1、是在使用的地方定义一个作用域比较短的局部变量,拼接完了,然后发送给客户端,然后系统自动释放其内存,下次使用再定义;2、可以定义一个作用域较大区域,或者定原创 2017-08-19 20:52:19 · 907 阅读 · 0 评论 -
linux下使用udpsocket时遇到的问题
linux下udpsocket的使用关于数据报socket的使用,很多博客都有,由于事先已知了客户端的ip字串,不想服务端使用通过recvfrom时保存下来的struct sockaddr_in*类型ip,想通过之前ip字串来让服务器给客户端发送数据,发现出现了,仔细研究后发现是发送数据给客户端时,使用了之前的服务器绑定的端口,这是不对的,客户端的端口是系统随机分配的,必须要使用之前获取客户端原创 2017-08-17 23:41:42 · 1235 阅读 · 0 评论 -
返回指向局部变量的指针或引用的带来的问题讨论
返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗? 返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。返回局部变量的引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。 还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返转载 2016-05-10 12:40:14 · 710 阅读 · 0 评论