c/c++
RYZR
这个作者很懒,什么都没留下…
展开
-
组合,关联,聚合的区别
转自网络,自己学习以下 类间关系在类图中,除了需要描述单独的类的名称、属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义。在UML类图中,关系用类框之间的连线来表示,连线上和连线端头处的不同修饰符表示不同的关系。类之间的关系有继承(泛化)、关联、聚合和组合。(1)继承:指的是一个类(称为子类)继承另外的一个类转载 2010-04-14 12:43:00 · 431 阅读 · 0 评论 -
C++ 对象的内存布局(中)
<br />重复继承<br />下面我们再来看看,发生重复继承的情况。所谓重复继承,也就是某个基类被间接地重复继承了多次。<br />下图是一个继承图,我们重载了父类的f()函数。<br /><br />其类继承的源代码如下所示。其中,每个类都有两个变量,一个是整形(4字节),一个是字符(1字节),而且还有自己的虚函数,自己overwrite父类的虚函数。如子类D中,f()覆盖了超类的函数, f1() 和f2() 覆盖了其父类的虚函数,Df()为自己的虚函数。<br />class B<br />{<b转载 2011-05-25 16:09:00 · 483 阅读 · 0 评论 -
函数指针(*(void (*)( ) )0)( ) 解析
<br /><br />在很多情况下,尤其是读别人所写代码的时候,对C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。<br /> 问题:声明与函数<br /> 有一段程序存储在起始地址为0的一段内存上,如果我们想要调用这段程序,请问该如何去做?<br /> 答案<br /> 答案是(*(void (*)( ) )0)( )。看起来确实令人头大,那好,让我们知难而上,从两个不同的途径来详细分析这个问题。转载 2011-05-25 17:52:00 · 701 阅读 · 0 评论 -
C++ 虚函数表解析
2008-11-14 作者:陈皓 来源:csdn<br />前言<br />C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。<br />关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相转载 2011-05-25 16:06:00 · 465 阅读 · 0 评论 -
C++ 对象的内存布局(上)
2008-11-14 作者:陈皓 来源:csdn<br />前言<br />07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达上方便和简单。不想,这篇文章成为了打开C++对象模型内存布局的一个引子,引发了大家对C++对象的更深层次的讨论。当转载 2011-05-25 16:08:00 · 467 阅读 · 0 评论 -
GCC编译的背后( 预处理和编译 汇编和链接)
<br /><br />by falcon<zhangjinw@gmail.com><br />2008-02-22<br />平时在Linux下写代码,直接用"gcc -o out in.c"就把代码编译好了,但是这后面到底做了什么事情呢?如果学习过编译原理则不难理解,一般高级语言程序编译的过程莫过于:预处理、编译、汇编、链接。gcc在后台实际上也经历了这几个过程,我们可以通过-v参数查看它的编译细节,如果想看某个具体的编译过程,则可以分别使用-E,-S,-c和 -O,对应的后台工具则分别为cpp,cc1转载 2011-05-31 16:25:00 · 1077 阅读 · 0 评论 -
gdb 调试段错误
<br /><br />开发嵌入式Linux的时候经常会遇到segmentation fault,也就是段异常错误,一般是使用错误的指针访问内存导致。这种错误可以通过打开内核的异常信息输出,再用gdb对发生段异常的地址进行定位。<br />1.打开内核的异常信息输出:<br />mips的内核代码关闭了arch/mips/mm/fault.c的do_page_fault():133中的这段代码:<br />#if 0<br /> printk("do_page_fault() #2: sending SI转载 2011-04-12 17:51:00 · 5821 阅读 · 1 评论 -
C++忠告
<br /><br />C++之父Bjarne Stroustrup写的《The C++ Programming Language (Special<br />Edition)》中各章后面的忠告。<br /><br />第1章 致读者<br />[1] 在编写程序时,你是在为你针对某个问题的解决方案中的思想建立起一种具体<br />表示。让程序的结构尽可能地直接反映这些思想:<br /> [a] 如果你能把“它”看成一个独立的概念,就把它做成一个类。<br /> [b] 如果你能把“它”看成一个转载 2011-04-20 18:00:00 · 547 阅读 · 0 评论 -
查看编译器自定义宏
1. cpp -dM /dev/null 命令可以查看本机gcc编译器自定义的宏2.c2-linux-cpp -dM /dev/null 我用c2的交叉编译器,所以执行这个命令就可产看c2的gcc编译的自定义宏3. gcc -dM -E - < /dev/null主要是为了用CPU架构来区分不同平台 例如 代码中有#if defined(__ppc64__)原创 2011-06-23 17:13:00 · 1156 阅读 · 0 评论 -
c++ template使用疑问
具体template使用网上可以看到说明,在这里强调一点关于template模版实参为空的特例。 转载网络关于c++考级的要点. 知识点4: 1.1 函数模板 1.1.1 考点1:函数模板的概念和声明 函数模板是一系列相关函数的模型或样板,这些相关函数的源代码形式相同,只是所针对的数据类型不同。对于函数模板,数据类型本身成了它的参数,因而是一种参数化类转载 2012-01-07 09:51:08 · 1613 阅读 · 0 评论 -
WebKit之HTML元素支持流程
介绍下webkit对于html元素的解析流程.DocumentLoader收到html后通过DocumentWriter调用HTMLDocumentParser::appendBytes,然后通过DocumentWriter解码后,调用HTMLDocumentParser::append添加到HTMLInputStream中,如果当前有js在执行,就调用HTMLPreloadScanner转载 2012-01-29 00:18:13 · 1066 阅读 · 1 评论 -
Curl和libcurl使用
<br /><br />一、curl简介<br /> <br />curl是一个利用URL语法在命令行方式下工作的文件传输工具。它支持的协议有:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道转载 2011-04-07 14:45:00 · 1271 阅读 · 0 评论 -
C++ 对象的内存布局(下)
<br />钻石型多重虚拟继承<br />虚拟继承的出现就是为了解决重复继承中多个间接父类的问题的。钻石型的结构是其最经典的结构。也是我们在这里要讨论的结构:<br />上述的“重复继承”只需要把B1和B2继承B的语法中加上virtual 关键,就成了虚拟继承,其继承图如下所示:<br /><br />上图和前面的“重复继承”中的类的内部数据和接口都是完全一样的,只是我们采用了虚拟继承:其省略后的源码如下所示:<br />class B {……};<br />class B1 : virtual publi转载 2011-05-25 16:10:00 · 465 阅读 · 0 评论 -
交叉编译 MSB 和LSB 问题
<br /> MIPS平台gcc交叉编译MSB和LSB问题<br /> <br /> 最近在做mips平台的工作,在交叉编译软件包的时候发现的问题现在记录下来,当我们用linux命令file一个文件的时候会出现如:<br />libiconv.so.2.5.0: ELF 32-bit LSB shared object, MIPS, MIPS32 rel2 versio原创 2011-03-29 12:29:00 · 10849 阅读 · 3 评论 -
情景分析“C语言的const关键字”
<br />C语言中的const一直是C语言初学者心中的痛,这是因为const在不同位置有不同作用,在不同情景有不同角色。这让初学者摸不清头脑。今天,和大家一起研究一下const,让它的每个角色都“深入人心”!<br />==============================================================================================<br />情景一:最简单的const用法#include<br />int main()<br转载 2010-09-27 10:16:00 · 387 阅读 · 0 评论 -
GNU C扩展
<br />要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特性对于我们分析内核有着很重要的作用,下面做些总结性的工作。<br /><br />一:柔性数组(flexible array) <br />柔性数组也称为零长度数组,或者零长度数组。这种数组通常在结构体当中出现,它本身并不占用空间,但是有了柔性数组意味着结构体的尺寸充满了变数。<br />例如以下例子:<br />struct usb_interface_cache {<br />转载 2010-12-27 21:58:00 · 977 阅读 · 0 评论 -
c struct 对齐
<br />有关字节对齐的介绍: <br /><br /><br /> 什么是对齐,以及为什么要对齐: <br /> 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 <br /> 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取转载 2010-12-29 17:41:00 · 486 阅读 · 0 评论 -
Linux下gcc编译中关于头文件与库文件搜索路径相关问题(一)
<br />关键字: 如何指定gcc的默认头文件路径<br />在交叉编译的时候我们需要用到其他的库,在 config 时候可以通过 “-I” 来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法。看下文的红色部分。 <br /><br />有大量的环境变量可供设置以影响 GCC 编译程序的方式。利用这些变量的控制也可使用合适的命令行选项。一些环境变量设置在目录名列表中。这些名字和 PATH 环境变量使用的格式相同。特殊字符 PATH_SEPARATOR (安装编译程序的时候定义)用在目转载 2011-03-20 20:00:00 · 1737 阅读 · 1 评论 -
Linux下gcc编译中关于头文件与库文件搜索路径相关问题(三)
<br />关键字: linux操作系统的头文件和库文件搜索路径<br />Include 的 header 文件 , 动态链接库,系统定义,总共有下列来源指定 gcc 去那里找。<br />当初在编译时指定的 ( 在 ~gcc/gcc/collect2.c:locatelib()<br />写在 specs 内的 ,内定的,这是当初 compile gcc 时写在程序内的。<br />后来用 -D -I -L 指定的<br />gcc 环境变量设定 ( 编译的时候 )<br />ld.so 的环境变量 (转载 2011-03-20 20:04:00 · 600 阅读 · 0 评论 -
控制符号的可见性
<br /> 在普通的C语言中,如果您希望将函数或者变量限制在当前文件中,需要对其使用static关键字。然而,在一个包含很多文件的共享库中,如果您希望某个符号可以被共享库内部的几个文件访问,而又不提供给外部,则对符号进行隐藏处理就会比较困难。大多数的连接器都提供一些便利的方法来隐藏或者显示模块中所有的符号,但如果希望更加具有选择性,则需要更多的处理。 在Mac OS X v10.4之前,有两种机制可以控制符号的可见性。<br /> 第一种技术是通过__private_extern__关键字,转载 2011-03-18 10:41:00 · 1419 阅读 · 0 评论 -
Linux下gcc编译中关于头文件与库文件搜索路径相关问题(二)
<br />关键字: linux指定动态库路径<br />Linux 指定动态库路径<br /> <br />众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib 。动态库被创建后,一般都复制到这两个目录中。当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函 数,以及该动态库的其它资源了。在 Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三转载 2011-03-20 20:01:00 · 716 阅读 · 0 评论 -
auto_ptr详解
<br /><br />auto_ptr详解<br /><br /><br />auto_ptr指针介绍<br /> auto_ptr是这样一种指针:它是“它所指向的对象”的拥有者。这种拥有具有唯一性,即一个对象只能有一个拥有者,严禁一物二主。当auto_ptr指针被摧毁时,它所指向的对象也将被隐式销毁,即使程序中有异常发生,auto_ptr所指向的对象也将被销毁。<br /> 1、设计动机:<br /> 在函数中通常要获得一些资源,执行完动作后,然后释放所获得的资源,当程序员忘记释放所申请的到转载 2011-03-24 10:30:00 · 974 阅读 · 0 评论 -
二进制实用程序(objdump, readelf,ar, nm等)
<br />GNU 二进制实用程序Binutils (GNU binary utilities)包括:objdump、readelf、addr2line、strip、ar、nm、ldd、ngprof、gcov等。<br /><br />一。 objdump - 显示二进制文件信息<br /><br />objdump可以根据目标文件来生成可读性比较好的汇编文件。常用的命令如下:<br /><br />gcc -g3 test.c -o test.o <br />objdump -Slz te转载 2011-05-17 18:03:00 · 1233 阅读 · 0 评论 -
嵌入式开发板与PC串口传输文件
嵌入式开发板与PC串口传输文件目标板与主机pc传输文件问题,可以使用linux的工具lrzsz 工具,交叉编译后把 lrz lsz 传输到目标版的bin目录下,然后在想要接受文件的目录下运行lrz :比如 cd /tmp 在tmp目录下运行lrz 则接受到的文件就放在tmp下。我的串口传输用kermit 所以需要在运行先设置一下kermit的配置 在/home/richard/.kermit 文件中写道:set line /dev/ttyUSB0set speed 1原创 2011-03-29 13:58:00 · 1930 阅读 · 1 评论 -
typedef(函数指针)重点说明
再谈typedef(重点为函数指针) 有种很方便的写法。typedefint *p;ppointer;这时直接把pointer带入原式中,取代p然后去掉typedef,得到的结果就是int* pointer;哈哈,这样直接替换就很直观多了。C语言语法简单,但内涵却博大精深;如果在学习时只是止步于表面,那么往往后期会遇到很多困难。typedef是转载 2012-01-03 17:20:24 · 725 阅读 · 0 评论