![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c/c++知识
文章平均质量分 79
liujianfei526
这个作者很懒,什么都没留下…
展开
-
offsetof与container_of宏[总结]
1、前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大。offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址。两个宏设计的很巧妙,值得学习。linux内核中有着两个宏的定义,并在链表结构中得到应用。不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了。后续认真研转载 2016-01-31 11:42:54 · 232 阅读 · 0 评论 -
Linux多线程编程
线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。可以把线程看成是操作系统分配CPU时间的基本单元。一个进程可以拥有一个至多个线程。它线程在进程内部共享地址空间、打开的文件描述符等资源。同时线程也有其私有的数据信息,包括:线程号、寄存器(程序计数器和堆栈指针)、堆栈、信号掩码、优先级、线程私有存储空间。为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统转载 2016-01-28 17:35:28 · 269 阅读 · 0 评论 -
select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用转载 2016-01-27 22:25:13 · 332 阅读 · 0 评论 -
vector清空 ,防止内存泄露
转自:http://blog.csdn.net/metalkittie/article/details/3115750注:使用过低三种方法,可行!vector int> vecInt; for (int i=0;i { vecInt.push_back(i); } int j= vecInt.capacity(); //j=512转载 2016-04-21 13:16:50 · 3895 阅读 · 0 评论 -
C语言中宏#define的用法
今天整理了一些#define的用法,与大家共享!1.简单的define定义#define MAXTIME 1000一个简单的MAXTIME就定义好了,它代表1000,如果在程序里面写if(i编译器在处理这个代码之前会对MAXTIME进行处理替换为1000。这样的定义看起来类似于普通的常量定义CONST,但也有着不同,因为define的定义更像是简转载 2016-05-30 21:41:13 · 416 阅读 · 0 评论 -
那些不能遗忘的知识点回顾——C/C++系列(笔试面试高频题)
有那么一些零碎的小知识点,偶尔很迷惑,偶尔被忽略,偶然却发现它们很重要,这段时间正好在温习这些,就整理在这里,一起学习一起提高!后面还会继续补充。——前言1.面向对象的特性 封装、继承、多态。 封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。(优点:可以隐藏实现细节,使得代码模块化) 继承:转载 2016-06-09 16:01:46 · 465 阅读 · 0 评论 -
C++标准里 string和wstring
在C++标准里定义了两个字符串string和wstring typedef basic_string string; typedef basic_string wstring; 前者string是常用类型,可以看作char[],其实这正是与string定义中的_Elem=char相一致。而wstring,使用的是wchar_t类型,这是宽字符转载 2016-06-05 12:40:18 · 554 阅读 · 0 评论 -
C/C++数据对齐
为了避免混淆,做如下规定,以下代码若不加特殊说明都运行于32位平台,结构体的默认对齐值是8,各数据类型所占字节数分别为char占一个字节int占四个字节double占八个字节。两个例子请问下面的结构体大小是多少?struct Test{ char c ; int i ;};这个呢?struct Test1{ int i转载 2016-06-05 15:26:07 · 258 阅读 · 0 评论 -
C语言open()函数:打开文件函数
相关函数:read, write, fcntl, close, link, stat, umask, unlink, fopen头文件:#include #include #include 定义函数: int open(const char * pathname, int flags); int open(const char * pathnam转载 2016-01-28 18:01:37 · 668 阅读 · 0 评论 -
Linux进程间通信——使用消息队列
下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处。有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信——使用命名管道一、什么是消息队列消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消转载 2016-01-28 19:16:31 · 363 阅读 · 0 评论 -
Linux进程间通信——使用信号量
这篇文章将讲述别一种进程间通信的机制——信号量。注意请不要把它与之前所说的信号混淆起来,信号与信号量是不同的两种事物。有关信号的更多内容,可以阅读我的另一篇文章:Linux进程间通信——使用信号。下面就进入信号量的讲解。一、什么是信号量为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码转载 2016-01-28 19:28:53 · 370 阅读 · 0 评论 -
linux stat函数讲解
stat函数讲解表头文件: #include #include 定义函数: int stat(const char *file_name, struct stat *buf);函数说明: 通过文件名filename获取文件信息,并保存在buf所指的结构体stat中返回值: 执行成功则返回0,失败返回-1,错误代码存于er转载 2016-01-31 11:42:17 · 330 阅读 · 0 评论 -
Linux下的IPC-UNIX Domain Socket 2013-08-30 11:01:02
一、 概述UNIX Domain Socket是在socket架构上发展起来的用于同一台主机的进程间通讯(IPC),它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。UNIX Domain Socket有SOCK_DGRAM或SOCK_STREAM两种工作模式,类似于UDP和TCP,但是面向消息的UNIX Domain Socke转载 2016-01-31 11:41:38 · 336 阅读 · 0 评论 -
LINUX环境并发服务器的三种实现模型
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器。按处理方式来分有循环服务器和并发服务器。1 循环服务器与并发服务器模型在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求。目前最常用的服务器模型有:·循环服务器:服务器在同一时刻只能响应一个客户端的请求·并发服务器:服务器在同一时刻可以响应多个客户端的请求转载 2016-01-31 10:27:08 · 289 阅读 · 0 评论 -
linux进程间通信的几种机制的比较及适用场合
1.# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正转载 2016-01-29 15:23:58 · 665 阅读 · 0 评论 -
sigsetjmp,siglongjmp的使用
相关函数:longjmp, siglongjmp, setjmp 表头文件:#include 函数定义:int sigsetjmp(sigjmp_buf env, int savesigs) 函数说明:sigsetjmp()会保存目前堆栈环境,然后将目前的地址作一个记号,而在程序其他地方调用siglongjmp()时便会直接跳到这个记号位置,然后还原堆栈,继续程序好执行。参数转载 2016-01-16 13:18:11 · 541 阅读 · 0 评论 -
LINUX 的Singal 信号 定义 说明
转载:http://blog.csdn.net/ljx0305/archive/2008/09/09/2904056.aspxSIGHUP 终止进程 终端线路挂断SIGINT 终止进程 中断进程SIGQUIT 建立CORE文件终止进程,并且生成core文件SIGILL 建立CORE文件 非法指令SIGTRAP 建立CORE转载 2016-01-14 16:34:12 · 429 阅读 · 0 评论 -
getpwnam函数学习
来个百度的复制粘贴getpwnam getpwnam() 函数功能:获取用户登录相关信息 原型定义: struct passwd *getpwnam(const char *name); 表头文件: #include #include 信息存贮在如下的结构体之中 struct passwd { char * pw_name; /* Username. */转载 2016-01-14 15:49:40 · 1233 阅读 · 0 评论 -
Linux 下的 fork()
[cpp] view plain copy for( i = 0; i if( fork() == 0 ) continue; 共生成多少个子进程?简查了一下 fork() 的知识,它调用一次,返回两次,进入子进程并返回一次,然后退到父进程再返回一次,子进程中返回值为 0,父进程中返回的是子进程的进程号。答案是 3转载 2016-01-22 10:48:15 · 303 阅读 · 0 评论 -
GDB调试
1.编译的时候需要加上-g这个选项2.list/l 列出程序源代码3.添加断点,break lineNum,or b linenum ,或者在函数名处添加短点 eg,b(reak) 47,b(reak) main,可以使用tab键补全函数信息4.栈跟踪,backtrace,bt ,查看堆栈信息5.检查变量,print j,or p j, eg.print a[3原创 2016-03-30 22:43:13 · 264 阅读 · 0 评论 -
stl-stable_sort源码学习笔记
前几天,一个新同事前来询问算法stl-stable_sort的情况。由于离上次研读stl源码时间久已(两三年前的事儿了),有些细节笔记模糊了。所以就找了sgi-stl和ms-stl俩版本,重新复习一遍其中的stl-stable_sort算法。稍微简单整理了阅读笔记,主要裁剪sgi-stl源码的“伪代码”,顺便加些注释还可看懂一二!sgi-stl 可读性笔记强。 事后,和新同事们讲解,分享转载 2016-07-13 23:33:14 · 417 阅读 · 0 评论 -
C++函数模板 模板实例化、具体化
C++函数模板 模板实例化、具体化 函数模板是C++新增的一种性质,它允许只定义一次函数的实现,即可使用不同类型的参数来调用该函数。这样做可以减小代码的书写的复杂度,同时也便于修改(注:使用模板函数并不会减少最终可执行程序的大小,因为在调用模板函数时,编译器都根据调用时的参数类型进行了相应实例化)。下面来看看函数模板的使用过程:struct job{ c转载 2016-07-04 23:14:41 · 301 阅读 · 0 评论 -
用GDB调试程序(三)
四、维护停止点上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。 clear 清除所有的已定义的停止点。 clear clear 清除所有设置在函数上的停止点。 cle转载 2016-09-04 16:03:19 · 274 阅读 · 0 评论 -
用GDB调试程序(四)
查看栈信息—————当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。下面是一些查看函数调用栈信息的GDB命令: backtrace bt 打印当前的函数调用栈的所有信息。如:转载 2016-09-04 16:04:15 · 234 阅读 · 0 评论 -
linux按指定时间删除文件和文件夹
find 命令可以完成这一需求,比如删除3天前的所有以“.log”结尾的文件:find /文件路径 -name "*.log" -mtime +2 -exec rm {} \;说明: 1. 文件路径是目标文件所在路径;2. -name 设定目标文件名,建议采用,否则可能误删其他文件;3. -ctime 文件最后一次修改时间,后面只能用整数,单位为天,同时,还转载 2016-09-04 16:18:38 · 27462 阅读 · 2 评论 -
哈希表存储效率50%的原因
本文主要是讲"哈希表的存储效率一般不超过50%"的原因。 Hash Table 常用于频繁进行 key/value 模式的查找中。(查找模式,如匹配查找) 哈希表最大的优点在于查找速度快,但存储时可能发生collision(冲突)。 哈希表大多使用open addressing来解决collision,此时search的时间复杂度计算公式为:转载 2016-09-03 23:40:17 · 2888 阅读 · 0 评论 -
水平出发和边缘出发的区别
在linux的IO多路复用中有水平触发,边缘触发两种模式,这两种模式的区别如下: 水平触发:如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知.允许在任意时刻重复检测IO的状态,没有必要每次描述符就绪后尽可能多的执行IO.select,poll就属于水平触发. 边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.在收到一个IO事件通转载 2016-09-06 21:47:43 · 1243 阅读 · 1 评论 -
select,poll,epoll的归纳总结区分
Select、Poll与Epoll比较以下资料都是来自网上搜集整理。引用源详见文章末尾。1 Select、Poll与Epoll简介Selectselect本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理。这样所带来的缺点是:1 单个进程可监视的fd数量被限制2 需要维护一个用来存放大量fd的数据转载 2016-09-06 21:48:12 · 254 阅读 · 0 评论 -
select、poll、epoll之间的区别总结[整理]
select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用转载 2016-09-06 21:48:58 · 361 阅读 · 0 评论 -
实现任意字节对齐的内存分配和释放
任意字节对齐的内存分配和释放。源码实现// 实现任意字节对齐的内存分配和释放 void *AllignedMalloc(size_t size, int aligned) { // aligned is a power of 2 assert((aligned&(aligned - 1)) == 0); // 分配内存空转载 2016-11-04 10:51:37 · 327 阅读 · 0 评论 -
实现支持2^n字节对齐分配的malloc和free函数
#include #include void* aligned_malloc(size_t size, size_t alignd_byte){ //offset地址偏移量(byte) //alignd_byte对齐字节的预分配空间 //sizeof(void *)保存真实指针的预分配空间 size_t offset = sizeof(void *) + alignd_byte -转载 2016-11-04 10:53:06 · 1157 阅读 · 0 评论 -
用GDB调试程序(六)
七、设置显示选项 GDB中关于显示的选项比较多,这里我只例举大多数常用的选项。 set print address set print address on 打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,如: (gdb) f #0 set_quotes转载 2016-09-04 16:02:39 · 182 阅读 · 0 评论 -
用GDB调试程序(七)
改变程序的执行——————— 一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让你更好的调试你的程序,比如,你可以在程序的一次运行中走遍程序的所有分支。 一、修改变量值 修改被调试程序运行时的变量值,在GDB中很容易实现,使用GDB的print命转载 2016-09-04 16:02:08 · 201 阅读 · 0 评论 -
用GDB调试程序(五)
查看运行时数据——————— 在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是: print print / 是表达式,是你所调试的程序的语言的表达式(GDB可以调试多种编程语言),是输出的格式,比如,如果要把表达式按1转载 2016-09-04 16:01:38 · 199 阅读 · 0 评论 -
关于C++中的虚拟继承的一些总结
1.为什么要引入虚拟继承虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下:class Aclass B1:public virtual A;class B2:p转载 2016-07-15 15:59:40 · 205 阅读 · 0 评论 -
C++异常处理机制详解
异常处理是一种允许两个独立开发的程序组件在程序执行期间遇到程序不正常的情况(异常exception)时相互通信的机制。本文总结了17个C++异常处理中的常见问题,基本涵盖了一般C++程序开发所需的关于异常处理部分的细节。1. throw可以抛出哪些种类的异常对象?如何捕获?1)异常对象通常是一个class对象, 通常用以下代码抛出:// 调用的类的构造函数throw popOnEm转载 2016-07-19 15:27:08 · 2064 阅读 · 0 评论 -
教你初步了解红黑树
教你初步了解红黑树 作者:July、saturnman 2010年12月29日本文参考:Google、算法导论、STL源码剖析、计算机程序设计艺术。推荐阅读:Left-Leaning Red-Black Trees, Dagstuhl Workshop on Data Structures, Wadern, Germany, Fe转载 2016-07-19 16:13:23 · 415 阅读 · 0 评论 -
MapReduce实现大矩阵乘法
引言何为大矩阵?Excel、SPSS,甚至SAS处理不了或者处理起来非常困难,需要设计巧妙的分布式方法才能高效解决基本运算(如转置、加法、乘法、求逆)的矩阵,我们认为其可被称为大矩阵。这意味着此种矩阵的维度至少是百万级的、经常是千万级的、有时是亿万级的。举个形象的栗子。至2012年12月底,新浪微博注册用户数超5亿,日活跃用户4629万[1],如果我们要探索这4000多万用户可以分成哪些类转载 2016-08-16 20:18:52 · 348 阅读 · 0 评论 -
STL的erase()陷阱-迭代器失效总结
下面材料整理自Internet&著作。 STL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector 、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。1.list,set,map容器 在使用 list、set 或 map遍历删除某些元素时可以这样使用:1.转载 2016-08-12 00:04:34 · 1404 阅读 · 0 评论 -
模板类声明和定义为何要写一起
http://www.gois.ws/showfile.asp?id=460:0:0如何组织编写模板程序 发表日期: 1/21/2003 12:28:58 PM 发表人: Nemanja Trifunovic前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WT转载 2016-09-03 16:12:48 · 355 阅读 · 0 评论