自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++之对象内存布局(继承、虚函数、虚继承等多种情况)

目录1. 对象内存布局基本情况2. 在不同情况下的对象内存布局——通过实验验证2.1 无继承2.1.1 无虚函数2.1.2 有虚函数2.2 深度为1的多继承2.2.1 无虚函数1. 对象内存布局基本情况(1)对象内存空间中存放的内容包括普通成员变量、虚表指针(如果类中包含虚函数)、虚基表指针(如果存在虚继承);(2)对象内存空间大小按结构体对齐原则来计算,若类是空类,则对象内存空间大小是1字节,以保证不同对象的内存地址不同;当空类作为基类时,对于派生类来说,其基类部分

2021-04-10 23:42:47 398 1

原创 C++之内存对齐(结构体嵌套等情况)

目录1. 为何需要内存对齐2. 内存对齐规则2.1 内置类型的对齐规则2.2 结构体or类类型对齐规则2.2.1 不考虑结构体嵌套情况2.2.2 结构体嵌套结构体1. 为何需要内存对齐提升CPU从内存中读取数据的效率。CPU将内存视作若干个大小相等的内存块,每一块的大小等于数据总线的宽度,CPU以块为基本单位读取数据。举个例子来说明,假设有一内存,其地址(以字节为单位)为{0,1,2,3,4,5,6,7,8,9,10,11},数据总线宽度是4字节。那么此内存被.

2021-04-10 00:41:48 840

原创 STL之list简要实现

(1)内存模型及实现接口(2) 源代码及简要注释sort性能比较低,对100万条随机数据排序要140秒左右,原版list的sort算法仅要1.4秒#ifndef TINY_LIST#include <memory>namespace tiny_stl{ //注意:此tiny_list有四种insert版本 //其中 //te...

2020-04-29 17:06:14 203 1

原创 STL之deque简要实现

(1)内存模型及实现接口(2)源代码及简要注释push_back、pop_back、push_front、pop_front性能和原版deque相当,insert性能慢1倍#ifndef TINY_DEQUE#include <memory>#include <cmath>#include <cstring>name...

2020-04-27 21:01:35 474

原创 STL之vector的简要实现

(1)内存模型及所实现的操作(2)源代码,附简要注释#ifndef TINY_VECTOR#include <memory>namespace tiny_stl{ template <typename T, typename U = std::allocator<T> > class tiny_vector //用指针表示...

2020-04-27 14:06:18 205

原创 数据流分析之WorkList Algorithm

(1)如何求解数据流方程?不论是Reaching Definition Analysis中对可达定义集合的求解,还是Liveness Analysis中对活跃变量集合的求解,本质上都是在解方程。以RDA举例,其数据流方程如下:可认为每个指令都对应方程中的两个变量,即IN(p)和OUT(p)。为了减少变量个数,把(1)式带入(2)式,以去掉IN(p):此时方程中的变量...

2020-04-08 22:48:55 1182

原创 数据流分析之Liveness Analysis

(1)什么是Liveness?我们说,变量v在程序点p处是活跃的,如果:a. 变量v在程序点p'处被使用,且程序点p和p'之间存在一条路径;b. 变量v在上述路径中没有被定义过;示意图如下:(2)什么是Liveness Analysis?LA是针对程序中的每个程序点(通常是一条指令的前后处),分析出活跃于此处的所有变量。 从Liveness的定义可看...

2020-04-08 14:37:46 1212

原创 数据流分析之Reaching Definition Analysis

(1)什么是Reaching Definition?假设变量v在程序点p处被定义(赋值),我们可以说,变量v在程序点p处的定义到达了程序点p',如果:a. 程序点p和p'之间存在一条路径;b. 变量v在上述路径中没有被重新定义(赋值);示意图如下:(2)什么是Reaching Definition Analysis?设p为某程序点,v = E为v的某定义语句:...

2020-04-07 20:25:39 1110

原创 一种基于最小堆和epoll的高性能定时器——时间堆

(1)时间堆的原理 定时器以到期时间作为排序值,存放于最小堆这种数据结构中。时间堆不以固定的频率来查询是否有定时器到期,而是每次当堆顶的定时器到期后才处理一次定时事件,避免了定期查询导致的开销。(2)难点分析及解决思路Q:如何确定堆顶定时器是否到期?A:仍然以定时的方式来提醒进程或线程有定时器到期,但定时时长是变化的,其值始终等于堆顶定时器到期的绝对时刻,与定时时刻之...

2020-04-04 20:49:14 778

原创 带有时间轮定时器的异步进程池的实现

此进程池是在《linux高性能服务器编程》—— 一种高效的异步进程池的实现基础上结合一种高性能定时器——时间轮的实现改造而来。(1)进程池框架(2)源代码及注释#ifndef PROCESSPOOL#define PROCESSPOOL#include <sys/types.h>#include <sys/socket.h>#include ...

2020-03-31 21:31:15 154

原创 一种高性能定时器——时间轮的实现

(1)时间轮样貌(2)源代码及注释#ifndef TIME_WHEEL#define TIME_WHEEL#include <stdio.h>#include <math.h>template <typename T> //T是客户类,应包含定时器class tw_timer //定时器类{public: int rot...

2020-03-31 19:14:34 268

原创 《linux高性能服务器编程》—— 三种线程同步机制的包装类:POSIX信号量、互斥锁和条件变量

(1)POSIX信号量:提供对共享资源的独占式访问以下使用未命名信号量作为包装类的核心。#include <semaphore.h>class sem{private: sem_t semp; //信号量public: sem() { //初始化一个信号量,第2个参数=0则表示此信号量为本进程所有,否则可在多个进程间共享 ...

2020-03-31 17:53:40 192

原创 《linux高性能服务器编程》—— 一种高效的异步线程池的实现

此文与《linux高性能服务器编程》—— 一种高效的半同步/半异步进程池的实现 是姊妹篇。(1)线程池框架(2)源代码及注释#ifndef THREADPOOL #define THREADPOOL#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>...

2020-03-29 23:31:52 205

原创 《linux高性能服务器编程》—— 一种基于共享内存的多进程聊天室服务器的实现

(1)程序框架(2)源代码及注释

2020-03-29 13:41:19 411

原创 《linux高性能服务器编程》—— 一种多个独立进程共享内存的方式

(1)先给出代码#include <sys/mman.h>#define BUFFER_SIZEint shmfd; //文件描述符char* share_mem; //指向共享内存的起始地址const char* shm_name = "/my_shm"; //文件名shmfd = shm_open(shm_name, O_CREAT | O_RDWR, 0666...

2020-03-28 21:54:56 130

原创 《linux高性能服务器编程》—— 一种高效的异步进程池的实现

(1)进程池框架(2)基于面对对象设计的实现思路首先思考一下主进程和各工作进程需要哪些数据:主进程:1. 进程池中工作进程的最大数量;2. 工作进程的实际数量;3. 保存有...

2020-03-27 14:39:57 261

原创 C++ primer——基于面向对象解决方案的文本查询程序

目录(1)程序基本框架(2)查询案例分析a. 查询最简单的queryb. 最简单的“~”查询c. 最简单的“&”查询(1)程序基本框架其中需要注意的是:a. WordQuery类中的query本质上是单个词汇,因此指向WorkQuery对象的接口类对象是query的最小单元;b. NotQuery、AndQuery和OrQuery等类中的qu...

2020-03-24 14:29:35 125

原创 C++语法系列——引用的左值/右值之分

目录(1)为何要区分?(2)那什么是左值/右值引用?(3)左值?右值?(4)左值/右值,与左值/右值引用有什么区别?(1)为何要区分? 引用的类型是左值/右值,指明了其绑定的对象的状态是仍有可能被使用,or不再被使用甚至将被销毁。而对象的状态(左值/右值)又可决定,如何“拷贝”对象所拥有的动态资源——拷贝or接管。这一操作依赖类内的拷贝/移动构造函数以及拷贝/...

2020-03-22 17:45:33 144

原创 C++语法系列——类的五大拷贝控制成员:拷贝/移动构造函数,拷贝/移动赋值运算符,析构函数

目录(1)都长什么样?有何用处?(2)何时会被用到?(1)都长什么样?有何用处?a. 拷贝构造函数,要求第一个形参是类类型的(const)左值引用,若有其他形参(通常没有),则必须有默认值。形式如下:class A{private: int i; char *ptr; static string str;};A(const A&...

2020-03-21 18:49:46 508

原创 C++语法系列——理解lambda表达式

(1)什么是lambda表达式?形式上表现为匿名内联函数,具有参数列表、返回类型和函数体等组成部分,但又与普通函数有一定差别,即它还具有一个捕获列表,且可定义在函数内部。其形式如下:[ 捕获列表 ] ( 参数列表 )-> 返回类型 { 函数体 }(2)捕获列表有何用处?其用处与lambda表达式的特性有关。由于lambda表达式可定义在函数内部,因此lambda表达式可...

2020-03-20 23:29:22 300

原创 C++语法系列——解引用和自增运算符的易混淆用法,如*p++,*++p,++*p

(1)指针、解引用、自增混合使用的情况仅有*p++,*++p,++*p这三种吗?此问题可用排列知识解答。指针、解引用和自增这三种元素的排列方式共有种,但由于解引用必须位于指针之前,因此种类数减半。(2)如何弄清它们的运算过程?先要弄清,解引用和自增的运算优先级以及结合方向。解引用和自增的运算优先级相同,且结合方向均是从右向左,这意味着:*p++ ~ *(p++),*++p ~ *(...

2020-03-20 16:51:47 1080

原创 如何理解最大子序列和的在线算法

(1)先给出在线算法的伪代码,仅针对至少含有一个正数的序列:Solve_MaxSubSum(A, n): sum <- 0 maxsum <- 0 boundleft <- 0 for i <- 0 to n-1 do sum <- sum + A[i] if sum <= 0 then ...

2020-03-19 12:57:20 229

原创 C++语法系列——怎样理解函数名

结论:在使用函数名时,可将函数名理解为一种特殊的指针,即指向自身的指针,再换句话说,指针存储的地址与自身的地址相同。可用以下程序验证:void fun() { int i = 0; }printf("fun = %p, *fun = %p, &fun = %p\n", fun, *fun, &fun);因此,在调用函数时,以下三种方式等价:fun() ===...

2020-03-18 23:49:08 281

原创 C++语法系列——const的顶层/底层之分

(1)先声明用处:顶层/底层通常用于修饰在定义指针时出现的const,即不可修改针对的是指针存储的地址,还是指向的对象a. 指针存储的地址不可修改,则const是顶层的,如 int* const ptr;b. 指针指向的对象(内容)不可修改,则const是底层的,如const int* ptr;c. 两者均不可修改,则一个const是顶层的,另一个const是底层的,如...

2020-03-18 23:10:44 146

原创 C++语法系列——隐式类类型转换

一、explicit(1)先声明用处:防止仅带一个形参的构造函数被用于隐式类类型转换(2)隐式类类型转换?以类A举例说明什么是隐式类类型转换及其本质class A{public: int age; string name;public: A() = default; A( int _age ): age( _age ) { };};void ...

2020-03-18 21:46:29 179

原创 LaTex 表格序号为奇数的解决办法

该问题通常是table中嵌套了longtable造成的。调用longtable时无论有没有使用\caption命令,表格计数器都会加1。\begin{table}[H]\caption{标题1}\begin{longtable}{ccc}\caption{标题2} \\ %在Longtable内部使用\caption命令,结尾必须加\\a & b & c\e...

2019-04-19 23:15:12 934 1

原创 PAT (Advanced Level) Practice——1024 Palindromic Number (25)

一、题目A number that will be the same when it is written forwards or backwards is known as a Palindromic Number. For example, 1234321 is a palindromic number. All single digit numbers are palindromic num...

2018-06-04 23:11:57 103

原创 PAT (Advanced Level) Practice——1023 Have Fun with Numbers (20)

一、题目Notice that the number 123456789 is a 9-digit number consisting exactly the numbers from 1 to 9, with no duplication. Double it we will obtain 246913578, which happens to be another 9-digit number...

2018-06-04 18:43:55 125

原创 PAT (Advanced Level) Practice——1016 Phone Bills (25)(25 分)

一、题目A long-distance telephone company charges its customers by the following rules:Making a long-distance call costs a certain amount per minute, depending on the time of day when the call is made. Wh...

2018-06-01 00:21:57 336

原创 PAT (Advanced Level) Practice——1012 The Best Rank (25)(25 分)

一、题目To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algebra), and E -...

2018-05-22 23:41:27 107

原创 《算法竞赛入门经典第2版》——习题2-6 排列(permutation)

一、题目 用1,2,3,...,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。二、算法思想 问题关键在于要找出1-9这9个数字所有的排列情况,用回溯算法很容易求解。(1)创建数组res[9],用于保存每位数字在排列中的位置;(2)所有数字都从最左边的位置开始一一尝试,位置上有其他数字...

2018-05-18 22:37:09 461

原创 浙大陈姥姥《数据结构》课后作业——10-排序5 PAT Judge(25 分)

The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT.Input Specification:Each input file contai...

2018-05-15 22:43:06 1537

轻量级下载程序aria2

下载速度快,基本可以达到你网络带宽的满速,同时支持的协议很多,不管你的下载链接是以 http,https 开头,还是以 magent 开头的磁力链接以及 BT 种子,它都可以下载。

2019-04-27

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除