
C++
文章平均质量分 72
CV_ML_DP
赏cv,ml,dp之美,创其价值
展开
-
逆置单链表,C++封装实现,经过测试。
已知:链表头head, 第一个节点为head->pNext方法:赋值指针:Node* curNode和Node* nextNode;CMyList类实现链表的封装1)创建链表2)逆置链表3)打印链表4)析构时自动释放链表main函数实现1)程序通过argv(只)接收数字(int)的链表数据2)然后根据接收的数字,通过CMyList对象创建内部链表原创 2016-04-26 01:21:02 · 499 阅读 · 0 评论 -
operator new之placement new/delete
如果operator new接受的参数除了一定会有的那个std::size_t之外还有其他,这便是所谓的placement new 众多placement new版本中特别有用的一个是“接受一个指针指向对象该被构造之处”,如下所示:void* operator new(std::size_t size, void* pMemory) throw(); 此版本的operato原创 2016-07-13 00:16:33 · 283 阅读 · 0 评论 -
operator new之避免覆盖标准形式的new/delete的“模板”类
由于成员函数的名称会覆盖外围(比如基类的、或外围namespace)的同名函数,即使参数列表不相同。所以应该必须避免让class的定制operator new/delete覆盖了外围同名函数new/delete下面的“模板”类,可以解决同名函数new/delete被覆盖的问题,其他类可以通过继承此基类即可。class CStdNewDelete{public: /原创 2016-07-13 00:38:40 · 1005 阅读 · 0 评论 -
实现一个线程安全的内存池(使用线程私有数据机制TSD来实现)
本文只给出功能代码,后续文章进行内存池相关知识的简介。#ifndef __BLUESKY_THREADSAFEMEMORY_H__#define __BLUESKY_THREADSAFEMEMORY_H__///编译时请执行 $g++ -c ./ThreadSafeMemory -o tsm.o -lpthread///使用pthread_once系列函数时,编译时要添加-lp原创 2016-07-01 23:52:13 · 2098 阅读 · 0 评论 -
自己实现的C++智能指针的功能代码和测试用例
1)C++,智能指针的相关知识请 wwww.baidu.com2)智能指针有很多功能点,不同项目可能需要的智能指针的功能点不一样多,所以人人实现的C++智能指针可能是不一样的。但是:智能指针的最基本的功能点还是必须要遵守的。3)今天趁着晚上的时间实现了C++ 智能指针的功能代码和测试用例,以下是实现代码。代码经过测试,可能编译通过和测试通过。代码中一定存在缺陷部分,请指出。4)注1原创 2016-07-05 00:20:14 · 1018 阅读 · 0 评论 -
对scoped_ptr智能指着的实现和测试用例
scoped_ptr1)是一个智能指针,不能用delete销毁它2)scoped_ptr智能指针只能有一份,因为scoped_ptr禁止了对智能指针的拷贝,通过将拷贝构造函数和赋值操作符都private化。3)scoped_ptr保管的原始指针是new出来的在堆上分配的动态对象(此对象的释放,由scoped_ptr来释放)4)scoped这个前缀的含义正是scoped_ptr智能指原创 2016-07-05 23:16:45 · 339 阅读 · 0 评论 -
对shared_ptr智能指针的功能代码实现和测试
见:http://blog.youkuaiyun.com/u012421852/article/details/51824749注:突然无法修改上一个博客的题目,只有重写一篇,然后把上篇博客的链接拷贝这里转过去了。原创 2016-07-05 23:26:42 · 343 阅读 · 0 评论 -
线程同步之semaphore信号量,代码实现
一般在任务处理线程池中会有一个公共任务队列m_event_list,任务监视线程有任务添加到m_event_list时,可以通过semaphore.post()增加信号量数来唤醒在semaphore信号量上的睡眠任务处理线程简要代码为:void add_event(Event &e){ m_event_list.push_back(e); m_semaphore.p...原创 2016-07-08 00:19:11 · 7317 阅读 · 0 评论 -
6句话说清楚Leader/Follower线程模型
本文为转载文章,原文地址:6句话说清楚Leader/Follower线程模型========================分割线================================================================上图就是L/F多线程模型的状态变迁图,共6个关键点:(1)线程有3种状态:领导leading,处理proces转载 2016-07-08 20:01:08 · 1260 阅读 · 0 评论 -
线程同步之信号量,代码实现方法2(条件变量+mutex互斥量)
方法1使用了系统semaphore,经过封装完成了信号量的实现,本文章为方法2,使用条件变量 + 系统互斥量mutex实现信号量semaphore,代码如下所示://semaphore.h#ifndef _SEMAPHORE_2_H__#define _SEMAPHORE_2_H__#include using namespace std;typedef unsigned i原创 2016-07-08 21:55:07 · 667 阅读 · 0 评论 -
【多线程】多线程C++实现UDP IPv4 Server Trunk(V2_1.0)--增加epoll机制
前期版本文章:【多线程】多线程C++实现UDP IPv4 Server Trunk(V1_1.0)前期版本文章链接: http://blog.youkuaiyun.com/u012421852/article/details/79173208本期文章update trunk,版本是V2_1.0: V2_1.0相比V1_1.0,增加了epoll机制实现了server端的io复用,提高了server...原创 2018-02-02 16:48:11 · 385 阅读 · 0 评论 -
【多线程】多线程C++实现UDP IPv4 Server Trunk(V1_1.0)
udp ipv4 server trunk工程代码: 链接:https://pan.baidu.com/s/1kWoI2jH 密码:yzzlserver功能和实现机制: 1)./a.out 1.1.1.1 12345,支持指定server ip和server port 2)多线程处理三种事件:接收数据到队列,显示队列数据,接收用户输入数据并发送给对端客户端原创 2018-01-27 10:09:08 · 1512 阅读 · 0 评论 -
【多线程】C++自实现适用于多线程的原子消息队列
这些是3年前都自实现的,现在记录起来,以防忘记丢失,以便后续查阅使用。代码: xinclude.h文件:#ifndef _XINCLUDE_H_#define _XINCLUDE_H_//include#include #include #include #include #include #include #include #inclu原创 2018-01-27 11:13:24 · 1683 阅读 · 0 评论 -
operator new之被Drived Class继承
对于operator new操作符有一个容易被忽略的特性:operator new成员函数会被derived class继承!定制operator new的一个常见理由就是为了针对所在class的对象分配行为提供最优化,而不是为了其derived class。下面先讲解下CBase *base = new CBase();的都执行了哪些接口:step1:如果定制原创 2016-07-12 00:32:19 · 732 阅读 · 0 评论 -
operator new之non-member operator new固守规则
non-member opertor new:void* operator new(std::size_t size) throw(std::bad_alloc);non-member operator new的常规有:1)入参size为0时,也返回一个合法的指针2)分配内存失败时必须调用operator new的错误处理函数new_handler3)如果new无法分配size原创 2016-07-10 23:59:48 · 506 阅读 · 0 评论 -
operator new之签名式new/delete(signature operator new/delete)
日常开发过程中,有想要替换编译器提供的operator new/delete,替换一定是有合理理由的。其中的一个可能就是:用来检测运行上的错误。new和delete导致的错误:1)如果对new的内存进行delete时失败,会导致内存泄漏memory leaks。2)如果对new的内存进行多次delete,则会导致无法想象的结果。人为编程导致的错误:1)"overruns":写入原创 2016-07-10 23:22:41 · 429 阅读 · 0 评论 -
为什么尽量以const,enum,inline替换#define?
为什么尽量以const,enum,inline替换#define?1. 先了解下预处理器和编译器从源代码到获取到可执行程序大致流程如下所示:Step1:源代码(source code) Step2:预处理器(preprocessor)Step3:编译器(compiler)Step4:目标代码(object code)Step5:链接器(Linker)Step6:可执原创 2016-04-16 14:24:32 · 2472 阅读 · 1 评论 -
从BlueSky.h和BlueSky.cpp到BlueSky.out的那些事儿
Step1:源代码(bluesky.h, bluesky.cpp)Step2: 查看预处理后的预处理文件命令:$g++ -E ./BlueSky.cpp > preproc.cpp生成的preproc.cpp就是预处理后的文件可以发现:#define是简单的字符串替换,而const变量不是简单的替换。还可以发现,源代码中cpp和h文件中存在很多处错误,但是预原创 2016-04-17 09:11:54 · 422 阅读 · 0 评论 -
Little-Endian or Bigger-Endian?
大小端是针对谁说的?答:CPU,采用小段模式的CPU操作数据时将操作数的低字节放到内存的低地址,采用大端模式的CPU会将操作数的低字节放到内存的高地址。先看几个常识:1)字符'A',十进制为65,十六进制为0x41,八进制为01012)系统对一个数据寻址时,总是从低字节的地址开始。3)系统对一个对象的存储是将对象中的一个字节一个字节依次存储的。3)int n; 整形原创 2016-04-17 16:37:20 · 430 阅读 · 0 评论 -
如何拒绝编译器为自己声明创建函数(default ctor, copy ctor, dtor, copy assignment)
在http://blog.youkuaiyun.com/u012421852/article/details/51172795中,介绍了编译器为一个类“润物细无声”地声明创建的一些函数。1)默认构造函数2)拷贝构造函数3)析构函数4)拷贝赋值操作符现在有一个问题,如果CBlueSky就是不想有拷贝赋值操作符,自己没有实现,但是无奈编译器会在使用时为自己声明创建一个拷贝赋值操作符,怎原创 2016-04-17 15:49:47 · 562 阅读 · 0 评论 -
C++编译器为空类“润物细无声”地做些什么
Step1:写个空类class CBlueSky{};注:sizeof(CBlueSky) 等于 1Step2:编译器可能会为CBlueSky空类声明以下函数/操作符:如果默认构造函数,拷贝构造函数,析构函数,赋值操作符,如下所示:class CBlueSky{public:CBlueSky() { ...}// 默认构造函数CBlueSky(const C原创 2016-04-17 13:00:59 · 449 阅读 · 0 评论 -
C++类型转换运算符之const_cast<newtype>(expression)
功能:主要是在const和volatile之间的转换Step1:const转换为volatile示例//< Const_cast.cpp#include using namespace std;int main(int args, char* argv[]){ //< reference const int &y = 0; int &ry = const_cast(y);原创 2016-04-17 20:37:15 · 508 阅读 · 0 评论 -
终止程序的方法
进程是资源分配的最小单位。进程:1)PCB(进程控制块)2)代码段3)数据段4)堆栈段一个程序 1n 进程终止程序的5种方法:1)main中调用return2)调用exit(c库函数)3)调用_exit(系统调用)4)调用abort(产生SIGBRT信号、异常终止)5)由信号终止(如Ctrl + c 产生的SIGINT信号原创 2016-04-17 21:58:59 · 3179 阅读 · 0 评论 -
linux,server/client,可直接挪用
近来再做性能测试时,基于C/S模式,记录下Server/Client的模块代码,可直接挪用。server和client遇到异常退出或者Ctrl+C被退出时,各自都可以安全清除所有的socket fd和断开所有的链接。原创 2016-04-20 23:31:52 · 389 阅读 · 0 评论 -
多线程安全计数器
在做性能测试时,需要统计运行一段时间内库使用锁的次数、获取时间戳的次数等。在做这些库范围内的某个动作的次数统计时,如果库内是多线程且动作在多个线程内都出现。可以使用下面的多线程安全的计数器/// Counter.h#ifndef __COUNTER_H__#define __COUNTER_H__#include "Mutex.h"class CCounter{原创 2016-05-06 22:36:20 · 1320 阅读 · 0 评论 -
连接符号:#、##
#是字符串连接符##是两个变量的连接符/// well.c#ifndef __WELL_H__#define __WELL_H__#define check_cond(exp, err_ret) \ do {\ if (!(exp))\ {\ fprintf(stderr, "%s:%d:%s, not match condition:"#exp"\n",\原创 2016-05-06 23:16:19 · 3526 阅读 · 0 评论 -
实现内存池MemoryPool(加了互斥锁的内存池实现:pthread_mutex_t + m_memory_pool)
在前面一篇用线程私有数据TSD实现了线程间无竞争的内存池,因为每个线程都会有自己的私有key对应的私有线程池,所以每个线程之间使用的内存池不会有任何竞争。文章地址:实现一个线程安全的内存池(使用线程私有数据机制TSD来实现)本篇文章使用公共内存池和系统锁pthread_mutex_t进行内存池的同步,所以本篇实现的内存池因为使用了公共内存池和锁,所以当有多个线程同时申请内存时,会产原创 2016-07-09 23:08:45 · 1529 阅读 · 0 评论 -
operator new之错误处理函数new_handler
就像可以用atexit来注册main的退出处理函数一样,我们也可以用std::set_new_handler来注册operator new的错误处理函数。当operator new无法满足某一内存分配需求时,operator new会抛出异常。但是当operator new无法满足某一内存分配需求而抛出异常之前,会先调用一个用户指定的错误处理函数,即所谓的new-handler。即原创 2016-07-10 19:52:33 · 1299 阅读 · 1 评论 -
【多线程】C++实现原子计数器 for Pthreads
在多线程环境下要计数,需要保证:计数变量的一致性和线程安全才能保证多线程环境下计数正确。原子计数正是提供了此需求的功能,保证计数操作未执行完毕时绝不会被其他任何实务或事件打断,下面是原子计数器 for pthreads缺点:使用锁的形式实现原子计数时锁的操作会比计数器的加减操作的消耗大很多,可以通过linux自带的性能检测工具perf命令查看哪些操作消耗多。#ifndef原创 2016-05-09 23:21:08 · 1945 阅读 · 0 评论