
C++
EINPROGRESS
这个作者很懒,什么都没留下…
展开
-
C++ new[] 实际申请内存
c++ 中使用new动态生成数组时,实际申请内存是否与期望值一样?如下面代码所示new int[count]申请内存是否等于len?const int count = 10;const int len = sizeof(int) * count;int *array = new int[count]; 编写测试代码如下。#define TRACE(fmt, args...) printf("原创 2017-06-04 22:08:29 · 2627 阅读 · 0 评论 -
C++11 STL之vector实现深入剖析(下)
上回我们分析了push_back函数。接下来我们来看下pop_back函数。递减_M_finish指针,然后析构最后一个对象,但是内存不会进行释放,即capacity接口返回值不变。这也说明了为何没有pop_front接口;倘若有,那么每一次调用都得将所有对象向前移动,vector不擅长此类操作。void pop_back(){ /* * 递减_M_finish指针,...原创 2019-01-05 00:27:46 · 681 阅读 · 0 评论 -
深入理解c++之struct构造函数
是否曾好奇struct定义的数据结构类型,当我拷贝构造时,或者赋值操作时会发生什么?倘若我结构中存在指针引用对象时,又能否正确处理?带着这些疑问,我们来对struct的构造函数进行研究,以解答以下几个疑问: 1) 何时编译器会自动为struct合成构造函数 2) 如何能保证携带指针引用对象的struct正确拷贝或拷贝构造 让我们...原创 2018-09-03 00:33:14 · 13159 阅读 · 0 评论 -
设计模式-Iterator迭代器模式
迭代器模式,即提供一种方法顺序的访问一个集合对象中的各个元素。而又不暴露其内部的表示。那么为什么需要这样设计呢?让我们考虑如下情况。 我们CString有两个不同版本的实现,然后当我们需要访问其各个元素时,却不得依据其集合的表达方式写出对应的访问。也就是说我们其实是在依赖于实现编程了。当有其他的实现版本的时候,我们访问各个元素的方式还得改变。因此迭代器应运而生,提供一...原创 2018-08-08 23:43:45 · 298 阅读 · 0 评论 -
c++之默认参数的可继承性及其原理
关于c++默认参数是否可以继承这个问题。我们先给出答案是,不可继承并且静态绑定为当前类接口的默认参数(如果有声明的话)上。当然,我们不单只需要知道结果,还应该探索一下原因。 考虑以下代码。非常简单的一段测试代码。有个IServer基类,其listen接口有个默认参数。IServer派生出两个子类CRPCServer与CHTTPServer,两个子类在其listen...原创 2018-08-02 00:02:40 · 2165 阅读 · 0 评论 -
从零编写c++之http服务器(3)-http服务
http全称超文本传输协议,可调试性高,扩展性也强。上两个篇章我们已经拥有了epoll事件驱动框架和线程池处理网络事件,接下来我们要先写一个基础网络套接字,然后在此基础上扩展出http的套接字。献上类图如下完整源码见<https://github.com/kwansoner/panda.git> ...原创 2018-07-27 22:32:42 · 18437 阅读 · 2 评论 -
从零编写c++之http服务器(2)-epoll异步事件驱动框架
epoll是select/poll基础上改进的为大规模描述符事件监测的机制,常出现在高性能,高并发的服务器设计中。在这里我们需要设计一个框架,实现套接字对象将自身注册到框架中,框架即可利用epoll对其套接字进行事件监测;当事件产生时通知相应的套接字对象。从而实现事件的监测与处理解耦。惯例还是献上类图。完整源码见<https://github.com/kwansoner/p...原创 2018-07-27 22:26:28 · 2788 阅读 · 6 评论 -
从零编写c++之http服务器(1)-线程池
引言 编写这么一个c++的http服务器,纯粹是满足多年前一个好奇心。为什么我输入链接可以打开一个网页?这背后究竟发生了什么?所以本着好事多磨的心理一点点从零写了这个http服务器。他有着以下几个特点。1) 基于epoll的异步事件驱动框架2) L/F线程池处理网络事件3) 完全从零编写http服务模块 当然实现中为了研究原理,仅做了关键功能的开发,...原创 2018-07-27 22:25:12 · 4312 阅读 · 2 评论 -
消除 pointer of type ‘void *’ used in arithmetic告警
考虑这么一段代码,编译时会产生警告void *指针用于算术运算,那么如果消除这个告警?ssize_t Send(int sockfd, const void *buf, size_t len, int flags){ size_t sendcount = 0x00; ssize_t nsend = 0x00; do{ nsend = send(sockfd, buf +...原创 2018-07-08 21:23:24 · 24297 阅读 · 0 评论 -
c++函数返回值的初始化
引言 c++函数返回值,如int, char, float等内建类型可以使用寄存器返回。但是如果我返回了自定义的一个类呢?那么函数返回时当前栈帧释放了,如果保存返回对象的值。它又在什么时候初始化? 让我们从汇编层次来看问题。代码 编写测试代码如下,非常简单的一个例子。测试平台为i386。#include <stdio.h>#include <stdint.h&g...原创 2018-06-20 23:45:10 · 1906 阅读 · 0 评论 -
设计模式-observer观察者模式
定义 观察者模式-在对象间定义一对多的依赖关系,这样一来当一个对象的状态更新时,其它对象都能得到通知更新。主题并不需要了解观察者具体实现细节,只需要保证观察者实现了观察者接口即可。观察者模式定义了对象间一对多的关系。即一个主题,多个观察者观察主题的状态变化。主题通过某个公共的接口来通知观察者。不要依赖于特定的通知顺序。除非设计一个能明确通知顺序的主题。一般来说主题...原创 2018-04-29 23:26:48 · 314 阅读 · 0 评论 -
深入理解c++多态实现原理
引言 多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。与之相对应的编译时绑定函数称为静态绑定。多态是面向对象编程的核心思想之一,因此我们有必要深入探索一下它的实现原理。理解了原理才能更好的使用。前置条件 现有代码如下所示,非常简单的例子。通过基类的引用调用recv函数来触发多态。接下来的分析涉及汇编知识,如果还没熟悉汇编,可以看另外一篇文章<...原创 2018-05-20 01:54:00 · 12295 阅读 · 1 评论 -
深入理解c++函数调用的参数传递与局部变量申请
引言 工作中最难以解决的BUG莫过于偶现,复现周期长,难以定位的,而有时core也是缺少调试信息的。这种情况下就需要通过堆栈还原工作现场来分析问题。尽管现在诸多解释性语言蓬勃发展,但语言的根本汇编我们还是需要掌握,无论对于解bug还是分析语言本质都有着奇效。掌握事物的本质才是真正的理解。测试代码 测试代码如下所示,很简单的例子。我们编译后使用gdb来分析函数调用前...原创 2018-05-13 21:58:30 · 2298 阅读 · 2 评论 -
设计模式-strategy策略模式
引言 关于设计模式有这么几本书可以推荐。<设计模式>这本当然是经典了,但是比较专业深晦,需要有一定的基础再反复琢磨;绝非看过一遍即可束之高阁。<Head First设计模式>即<设计模式>的白话版,文章清晰简介,重点明确;非常适合入门新人。但是<Head First设计模式>例子以java编写,在此给出c++例子,以供c+...原创 2018-04-27 22:24:49 · 272 阅读 · 0 评论 -
浅谈pthread退出方式以及清理问题
资源的销毁远比创建来得困难,例如线程。线程终止有很多种方式,如自然退出,显式调用pthread_exit。但是执行退出的时机,线程可能阻塞在如read, write,pthread_cond_wait等接口, 无法自然退出。那么就只好发送cancel信号强行终止了,但是这种强行终止是有代价的,我们需要考虑好线程终止时资源的清理问题。 线程的接收cancel信号的处理...原创 2018-04-01 22:30:12 · 8658 阅读 · 0 评论 -
友元的互相依赖问题
友元,是一种对非成员函数或类提供私有成员访问权限的机制。以关键字friend声明,通常出现在类的起始或结尾处。但是实际使用中也容易碰到友元声明与定义之间的互相依赖问题。 例子如下,我们对Mutex和Condition Veriable进行封装,由于条件变量的等待函数需要操作原始pthread_mutex_t对象,因此我们需要将条件变量的类声明为Mutex类的友元。我们先...原创 2018-04-03 22:07:52 · 853 阅读 · 0 评论 -
C++11 STL之vector实现深入剖析(上)
概述 vector是一种线性容器,因此它的所有成员都是按照严格的线性排序。Vector是通过动态数组来实现的,因此它的成员都是存放在连续的内存中。所以我们不仅可以通过迭代器去遍历成员,还可以通过成员的指针加偏移来访问。因此vector擅长通过下标来索引单个成员 任意顺序迭代访问所有成员 从尾部追加或删除成员类图 首先我们来看下vector的类图,为了便...原创 2019-01-01 23:37:58 · 2327 阅读 · 0 评论