c/c++
文章平均质量分 86
一支兰州
这个作者很懒,什么都没留下…
展开
-
c++异常机制分析
C++异常机制概述 throw 关键字 异常对象 catch 关键字 栈展开、RAII 异常机制与构造函数 异常机制与析构函数 noexcept修饰符与noexcept操作符 异常处理的性能分析正文C++异常机制概述异常处理是C++的一项语言机制,用于在程序中处理异常事件。异转载 2016-05-03 08:31:51 · 641 阅读 · 0 评论 -
c++基类和派生类
派生类的继承方式总结:继承方式说明public基类的public和protected的成员被派生类继承后,保持原来的状态private基类的public和protected的成员被派生类继承后,变成派生类的private成员protected 基类的public和protected的成员被派生类继承后,变成派生类的protected成转载 2016-04-04 17:14:12 · 395 阅读 · 0 评论 -
C++中placement new操作符
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; } 首先我们区分下几个容易混淆的关键词:new、转载 2016-04-02 17:18:10 · 480 阅读 · 0 评论 -
c结构体对齐深刻理解
最近在实习的公司,作为新人和其他的新人做了一个新人技术交流会,主要是关于C的一些基础知识,包括了C的编译,链接,指针,数组,字符串,结构体等,以及一些项目相关的知识,总的来说技术交流会还是很有用的,大家可以相互讨论,这样更容易理解。好了,言归正传,C中对于结构体的使用可以说是非常的频繁和必要的,正确理解结构体的内存对齐原则,对于用好C是很有必要的(小子在实际项目中确实遇到过一个结构体内存对齐引起的转载 2016-03-18 17:06:06 · 3083 阅读 · 0 评论 -
探讨read的返回值的三种情况
作者:[email protected]博客:blog.focus-linux.net linuxfocus.blog.chinaunix.net 本文的copyleft归[email protected]所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。===================转载 2016-03-17 21:33:41 · 4874 阅读 · 0 评论 -
排序算法的总结
直接插入排序:假设部分序列有序,然后将无序的部分循环插入到已有序的序列中。对于随即顺序的序列的时间复杂度:O(N^2),对于基本有序的序列时间复杂度:O(N)。空间复杂度:O(1)。代码如下:/*Straight Insertion Sort**时间复杂度:O(n^2) 最好:O(n) **空间复杂度:O(n)*/void straight_insert_sort(int *nums,原创 2015-09-18 20:12:42 · 535 阅读 · 1 评论 -
虚函数-运行时多态的理解
形状对外公开一个函数来把自己绘制出来。这是合理的,形状就应该能绘制出来,对吧?由于继承的原因,多边形和圆形也有了绘制自己这个函数。现在我们来讨论在这三个类中的绘制自己的函数都应该怎么实现。在形状中嘛,什么也不做就行了。在多边形中嘛,只要把它所有的顶点首尾相连起来就行了。在圆形中嘛,依据它的圆心和它的半径画一个360度的圆弧就行了。可是现在的问题是:多边形和圆形的绘制自己的函数是从形状继承而转载 2016-03-16 09:20:29 · 1399 阅读 · 0 评论 -
C++中的explicit关键字
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性转载 2016-03-02 08:46:38 · 268 阅读 · 0 评论 -
printk的定向问题
相信很多人在第一次接触到linux驱动程序的时候都遇到了两个基本的问题。 1.不知道怎么编译才能编译出linux模块程序。 2.写自己第一个linux驱动程序的时候,发现printk并不会向我们想想的那样把log信息显示在我们的终端上。 我自己也同样遇到了两个问题。 现在和大家分享下我从中学到的,当然肯定是不全面的。 1.linux模块的编译方法。 如果是一个简单的测试程序那么Makefile中只转载 2015-12-22 16:05:32 · 2450 阅读 · 0 评论 -
数组指针和指向指针的指针
一道面试题引发的问题,首先要知道[]的优先级高于*,题目:char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题?为什么?直接用程序说明:#includevoid main(){ char **p,a[6][8]; p = a; printf("\n");}编译,然后就会发现通不过,报错:错误 1 err转载 2015-11-12 22:40:25 · 383 阅读 · 0 评论 -
gdb反向调试命令
使用调试器时最常用的功能就是step, next, continue,这几个调试命令都是“往下执行”的, 但是很多时候会有这种需求:你在调试的过程中多跳过了几步而错过中间过程,这时候不得不重头调试一遍,非常麻烦。而GDB从7.0版本开始支持反向调试功能,也就是允许你倒退着运行程序,或者说撤销程序执行的步骤从而会到以前的状态。 直观地来看,加入你正在使用GDB7.0以上版本的调试器并转载 2015-11-10 21:51:38 · 573 阅读 · 0 评论 -
LeetCode 1.Two Sum
由于找工作的需要开始刷LeetCode上面的题目,使用的是c语言。水平有限,方法也比较笨。以后每道题我会先写出我自己的方法,然后学习下大神的方法,并适当的记录下一些思路和想法。/** * Note: The returned array must be malloced, assume caller calls free(). */int* twoSum(i原创 2015-09-20 15:18:47 · 499 阅读 · 0 评论 -
c --副作用和顺序点
C 语言中,术语副作用是指对数据对象或者文件的修改。例如以下语句[cpp] view plaincopyvar = 99; 的副作用是把 var 的值修改成 99。对表达式求值也可能产生副作用,例如:[cpp] view plaincopyse = 100转载 2015-10-22 20:44:15 · 509 阅读 · 0 评论 -
c/c++复习日记 1.不带缓存的I/O和标准I/O
不带缓存的I/O:每次read 和write都调用内核中的一个系统调用,他们不属于ISO c的一组成部分。对于内核而言,所有打开的文件都通过文件描述符引用,文件描述符是一个非负整数。当打开一个现有文件或者新建一个文件时,内核向进程返回一个文件描述符。通过read和write读写时,open或者create返回的文件描述符作标示该文件,将其作为参数传递给read或write。原创 2015-09-18 15:52:02 · 405 阅读 · 0 评论 -
vim下方便代码阅读的工具ctags
1.ctags简介: “哦,这个多的文件,我该如何去查看XX函数的实现!”相信这是很多朋友的抱怨。太多的文件导致我们无法去定位一个函数的实现或者一个宏定义的位置。显然对于源码的阅读和个人的学习都是非常不利的。多么希望有一个软件能够输入命令就能够精确的定位函数的位置。是的,现在有这么一个工具:ctags,它需要和vim编辑器配合使用,让源码阅读可以更加轻松。转载 2016-04-04 17:18:42 · 461 阅读 · 0 评论 -
构建c/c++项目时添加宏定义
有时候我们希望在构建时能够在命令行添加一些宏定义,改变程序行为。一个典型应用示例是代码里通过检查是否定义了 DEBUG 宏,来决定是否输出调试信息。编译器一般提供命令行选项支持这种做法,例如使用 gcc 时可以在命令行添加 -D 选项,定义一些宏:gcc -DDEBUG=1 a.c不过,大型项目一般都需要自动化构建工具,如 GNU Autotools 或者 CMake。使用它们后,转载 2016-04-04 21:22:46 · 11415 阅读 · 1 评论 -
大型项目使用Automake/Autoconf完成编译配置
使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefile,而且换个编译环境,Makefile还需要修改(Eclipse也是这样)。 这么好的东东当然要拿来用了,但GNU的Autotool系列博大精深,工具数量又多,涉及的语言也多,要是自己从头看转载 2016-04-04 21:25:46 · 1025 阅读 · 0 评论 -
yum只下载不安装包
1. 安装yum-downloadonly或 yum-plugin-downloadonly 软件包。可以执行以下命令安装yum-downloadonly包:#yum install yum-downloadonly说明:yum-downloadonly是yum的一个插件,使得yum可以从RHN或者yum的仓库只下载包而不安装。安装完成后,查看/etc/yum/pl转载 2016-03-28 22:40:07 · 3642 阅读 · 0 评论 -
虚表的存储位置
我看到了很多有意思的答案,都回答的比较好,下面贴出一些具有代表性的:Answer 1:Answer 2:我们都知道,虚函数是多态机制的基础,就是在程序在运行期根据调用的对象来判断具体调用哪个函数,现在我们来说说它的具体实现原理,主要说一下我自己的理解,如果有什么不对的地方请指正在每个包含有虚函数的类的对象的最前面(是指这个对象对象内存布局的最前面,至于为什么是最转载 2016-04-26 14:36:37 · 4643 阅读 · 1 评论 -
字节对齐与结构体大小
说明:结构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof我们将在另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结,也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不转载 2016-03-28 17:26:01 · 448 阅读 · 0 评论 -
inline和宏的优点和缺点
优点:1)inline定义的内联函数,函数代码被放入符号表中,在使用时进行替换(像宏一样展开),效率很高。2)类的内联函数也是函数。编绎器在调用一个内联函数,首先会检查参数问题,保证调用正确,像对待真正函数一样,消除了隐患及局限性。3)inline可以作为类的成员函数,刀可以使用所在类的保护成员及私有成员。缺点:内联函数以复制为代价,活动产函数开销1转载 2016-03-28 16:14:50 · 3285 阅读 · 0 评论 -
函数调用过程
引言如何定义函数、调用函数,是每个程序员学习编程的入门课。调用函数(caller)向被调函数(callee)传入参数,被调函数返回结果,看似简单的过程,其实CPU和系统内核在背后做了很多工作。下面我们通过反汇编工具,来看函数调用的底层实现。 基础知识我们先来看几个概念,这有助于理解后面反汇编的输出结果。栈(stack)栈,相信大家都十分熟悉,push转载 2016-03-15 16:13:52 · 774 阅读 · 0 评论 -
虚函数调用过程
1.(mov ecx,dword ptr [ebp-0Ch])将this指针压入ecx2.(mov edx,dword ptr [ecx])this指针指向该对象的首地址,而该处的前四个字节存放着该对象的虚函数表的首地址,将虚表指针放到edx中。3.(call dword ptr [edx+4])由于edx中存放着虚表指针,则edx+4表示调用该虚表中的第二个函数4.执转载 2016-03-15 15:54:33 · 3625 阅读 · 0 评论 -
简单的线程池实现
一、什么是线程池应用程序可以有多个线程,这些线程在休眠状态中需要耗费大量时间来等待事件发生。其他线程可能进入睡眠状态,并且仅定期被唤醒以轮循更改或更新状态信息,然后再次进入休眠状态。为了简化对这些线程的管理,.NET框架为每个进程提供了一个线程池,一个线程池有若干个等待操作状态,当一个等待操作完成时,线程池中的辅助线程会执行回调函数。线程池中的线程由系统管理,程序员不需要费力于线程管理,可转载 2016-03-14 16:51:07 · 267 阅读 · 0 评论 -
深入c++ new
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:clas转载 2016-02-29 19:03:47 · 291 阅读 · 0 评论 -
c++ const类成员函数
我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误。例如,[cpp] view plain copy const char blank = ‘’; blank = ‘\n’; // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据转载 2016-02-29 11:33:12 · 349 阅读 · 0 评论 -
c++标准库和命名空间std
1、命名空间std C++标准中引入命名空间的概念,是为了解决不同模块或者函数库中相同标识符冲突的问题。有了命名空间的概念,标识符就被限制在特定的范围(函数)内,不会引起命名冲突。最典型的例子就是std命名空间,C++标准库中所有标识符都包含在该命名空间中。 如果确信在程序中引用某个或者某些程序库不会引起命名冲突(即库中的标识符不会在程序中代表其他函数名称),那么可以通过using操作转载 2016-02-28 16:11:04 · 5897 阅读 · 2 评论 -
二叉树的深度和广度优先搜索
深度优先搜索算法(Depth First Search),是搜索算法的一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。如右图所示的转载 2016-02-28 10:46:52 · 2226 阅读 · 0 评论 -
static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
隐式转换(implicit conversion)short a=2000;int b;b=a;short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如下图所示。宽化转换(如char到int,int到long long,int到float,float到double,int到double等)构成隐式转换,转载 2016-02-27 19:46:45 · 382 阅读 · 0 评论 -
c++常用特性原理解析
在我的早期印象中,C++这门语言是软件工程发展过程中,出于对面向对象语言级支持不可或缺的情况下,一群曾经信誓旦旦想要用C统治宇宙的极客们妥协出来的一个高性能怪咖。它驳杂万分,但引人入胜,出于多(mian)种(shi)原因,我把它拿出来进行一次重新的学习。这篇笔记从G++编译出的汇编代码出发,对部分C++的常用面向对象特性进行原理性解释和总结,其中包括 引用、类(成员函数,构造函数)、多态(编译时,运转载 2016-04-05 21:30:32 · 787 阅读 · 0 评论 -
Linux--Socket Buffer--Netowrk Devices--Network Drivers
目录(?)[+]1. ISO参考模型与TCP/IP参考模型2. 在kernel中如何管理网络包(Network Packets)2.1 定义Socket Buffers Socket Buffers 由以下两部分组成: 1) Packet data: 它是在网络上传输的数据,其存储位置对应的PDU (Protoco转载 2015-09-15 09:51:08 · 602 阅读 · 0 评论 -
epoll的读写方式
在一个非阻塞的socket上调用read/write函数, 返回EAGAIN或者EWOULDBLOCK(注: EAGAIN就是EWOULDBLOCK)从字面上看, 意思是:EAGAIN: 再试一次,EWOULDBLOCK: 如果这是一个阻塞socket, 操作将被block,perror输出: Resource temporarily unavailable总结:这个错误表示资源暂转载 2015-07-12 10:31:11 · 1241 阅读 · 1 评论 -
char 与 unsigned char的区别引出的思考
今天在APUE上遇到unsigned char 来定义变量, 大家都是unsigned表示的是无符号,对于char类型来说 char 本身相当于只有一个字节的int类型,这个字节中取最高位以充当符号位,剩余7位用来表示数值。而unsigned char 整个字节全部用来表示数值。so,很显然一个字节的char类型表示数值范围是-128~127(补码),unsigned char 表示的数值范围是0原创 2015-03-13 15:21:37 · 636 阅读 · 0 评论 -
.h头文件 .lib库文件 .dll动态链接库文件关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的。附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件。如果要完成源代码的编译和链接,有头文件和lib就够了。如果也使动态连接的程序运行起来,有dll就够了。在开发和调试阶段,当然最好都有。.h .lib .dll三者的关系是:H文件作用是:声明函数接口DLL文件作用是: 函数可执行代码转载 2015-03-10 19:17:06 · 365 阅读 · 0 评论 -
.a静态库生成与使用
/* test.c */ int f() { return 3; } /* test.c */int f() { return 3;}代码非常简单,只有一句话。我们敲入如下命令:gcc –c test.car cr libtest.a test.o会在当前目录下生成一个libtest.a静态库文件。-c表示只编译,不链接。再原创 2015-03-10 20:47:36 · 1287 阅读 · 0 评论 -
Windows 动态链接库 DLL 浅析
Dll Hell动态链接库Dll编写Dll使用目录(?)[+]一概念二由来三DLL的优缺点四DLL与lib的关系五如何生成一个DLL创建一个Win32 Dynamic-Link Library方式的空工程取名为myDLL分别添加头文件h和源文件cpp编译连接六如何调用一个DLL1单纯使用dll2h lib dll 结合方式一、概念DL转载 2015-03-06 18:09:24 · 435 阅读 · 0 评论 -
GCC命令详解
1简介2简单编译2.1预处理2.2编译为汇编代码(Compilation)2.3汇编(Assembly)2.4连接(Linking)3多个程序文件的编译4检错5库文件连接5.1编译成可执行文件5.2链接5.3强制链接时使用静态链接库1简介GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C转载 2015-03-06 17:10:33 · 395 阅读 · 0 评论 -
后缀名“.dll .obj .lib”和“ .so .o .a”文件的区别含义
(1) .dll .obj .lib使用在windows平台下。 .dll:动态链接库,作为共享函数库的可执行文件。 .obj:目标文件,相当于源代码对应的二进制文件,未经重定位。 .lib:可理解为多个obj的集合,本质与.obj相同。 (2) .so .o .a使用在linux平台下。 .so:(share objec转载 2015-03-06 17:43:15 · 3528 阅读 · 0 评论 -
typedef函数指针用法
目录(?)[+]简单的函数指针的应用使用typedef更直观更方便例子说明1.简单的函数指针的应用形式1:返回类型(*函数名)(参数表) [cpp] view plaincopyprint?char (*pFun)(int); char glFun(int a){ return;} void main() { pF转载 2014-12-29 21:28:01 · 343 阅读 · 0 评论 -
C++中extern “C”含义深层探索
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不转载 2015-03-15 18:04:52 · 311 阅读 · 0 评论