C 结构体内存对齐原则 这个地方总会忘,自己写一遍就记住了关于结构体内存对齐(在没有#pragma pack宏的情况下)数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素
线程池实现 thread.h#ifndef __THREAD_H #define __THREAD_H #include <vector> #include <string> #include <pthread.h> using namespace std; /** * 执行任务的类,设置任务数据并执行 */ class CTask
redis 扩容(非集群) 场景生产环境有1台redis,主备结构,因数据量增大,需要额外增加两台redis思路:由于使用的非redis集群,hash问题需要自己处理。可以在客户端与redis服务器之间增加一台twenproxy做代理,使用twenproxy的hash策略,可以避免客户端修改代码。 另外一个问题是原有redis的数据由于采用了新的hash策略,必然造成一部分数据miss。解决这个问题可以有两种思路: 1.
linux top 命令参数详解 简介top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU
shell 按行读取文件的问题 有个需求需要在shell中按行读取一个文件,文件类似于11111 222222 33334444 55556666 7777 8888 999使用for in 语句读的时候,发现$line中的数据是按空格来划分的,并不是完整的一样for line in $(<test.log)do echo $linedone读出来的结果: 11111 222222 3333
大根堆排序结果为升序 之前一直存在的误区,认为大根堆可以是用来降序排列的,因为大根堆总是可以先输出最大的元素堆顶(从这个角度来说,也确实可以完成降序排列~)。实际情况是对排序分为两部 1. 建堆 2. 堆排序 列如给个序列 6 5 3 2 4 1 7 建大根堆后得到的序列为 7 5 6 2 4 1 3第一次排序: 6 5 3 2 4 1 7 第二次排序: 5 4 3
NULL ,nullptr,nullptr_t,0 区别 先看NULL的定义#ifndef __cplusplus#define NULL ((void *)0)#else /* C++ */#define NULL 0c语言中将NULL定义为空指针,而在c++中直接定义为0,这是因为C++是强类型的,void *是不能隐式转换成其他指针类型的。 既然NULL被定义成0,就存在二义性 c++ 中我们写这样一个函数 1test(classA a
shell脚本查询mysql 接到统计需求,需要对一批对一批uid过滤,只保留10月1日之后注册的uid,用户注册时间可以从mysql里面拿,写了个shell脚本 ps:用户信息使用十库十表存储,像 12345这个uid存储在5这个库中的4这个表里面 #! /bin/bashhostip="107.0.0.1"port=6304username="net_budao_root"pwd="123456"database=
孤儿进程与僵尸进程 概念孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程控制块PCB仍然保存在系统中,这种进程称之为僵尸进程。危害 如果父进程进程不调用
const 参数重载与const 成员函数重载 const 参数重载《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const 确定调用哪一个函数。”但是这一段描述并没有给出引用、指针和值传递前加const的实质区别是什么。在用非const的指针,引用和值均可转化为const的。
内联函数与宏定义的区别 使用宏和内联函数都可以节省在函数调用方面所带来的时间和空间开销。二者都采用了空间换时间的方式,在其调用处进行展开: 不同之处在预编译时期,宏定义在调用处执行字符串的原样替换。在编译时期,内联函数在调用处展开,同时进行参数类型检查。内联函数首先是函数,可以像调用普通函数一样调用内联函数。而宏定义往往需要添加很多括号防止歧义,编写更加复杂(边际效应)宏定义是没有类型检查的,无论对还是错都是直接替
IO多路复用之select 1. 基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: 1. 当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 2. 当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 3. 如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
IO多路复用之epoll 1. 基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次?不太理解这句话。2、epoll接口 epoll操作过程需要三个接口,分别如下:#include
TCP连接与断开 TCP 连接与断开1. TCP 状态LISTEN:侦听来自远方的TCP端口的连接请求SYN-SENT:再发送连接请求后等待匹配的连接请求SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认ESTABLISHED:代表一个打开的连接FIN-WAIT-1:先前的连接中断请求的确认,等待的是fin的确认,通过发送第一个fin触发FIN-WAIT-2:等待另一方的终端请求
16进制char 转换 string 网上查了下相关内容。乱七八糟,还不如自己写 string cTstr(char* c){ char h=c>>4; if(h>=0&&h9){ h=h+0x30; }else if(h>9&&h15){ h=h+'a'-10; }else{return "";}
GetWindowRect和GetClientRect GetWindowRect和GetClientRect原文:http://blog.chinaunix.net/u/25372/showart_304363.htmlGetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。 GetClientRect取得窗口客户区(不包括非客户区)在客户