- 博客(26)
- 收藏
- 关注

原创 C and C++ Common Knowledge
-1,程序中各段的意义如下:.text(代码段):用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存种的镜像。.data(数据段):数据段用来存放可执行文件中已初始化全局变量,也就是存放程序静态分配的变量和全局变量。.rodata(只读段):该段保存着只读数据,在进程映象中构造不可写的段。.bss(BSS段):BSS段包含了程序中未初始化全局变量,在内存中 bss段是否全部置零依赖于系统
2006-03-23 12:59:00
1833
转载 Windows XP 快上几倍的三招
Windows XP 快上几倍的三招Windows XP 快上几倍的三招,很简单: 1 、减少开机磁盘扫描等待时间,开始 → 运行,键入: chkntfs /t : 0 2 、删除系统备份文件: 在各种软硬件安装妥当之后,其实 XP 需要更新文件的时候就很少了。开始 → 运行,敲入: sfc.exe /purgecache 然后回车即可,近 3xxMb.
2007-09-09 23:57:00
1802
转载 深入浅出Win32多线程程序设计之线程通信
深入浅出Win32多线程程序设计之线程通信作者:宋宝华 出处:天极开发线程之间通信的两个基本问题是互斥和同步。简介 线程之间通信的两个基本问题是互斥和同步。 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的操作系统资源(指的是广义的"资源",而不是Windows
2007-09-09 23:41:00
1083
转载 C++基本概念在编译器中的实现
对于C++对象模型,相信很多程序员都耳熟能详。本文试图通过一个简单的例子演示一些C++基本概念在编译器中的实现,以期达到眼见为实的效果。 1、对象空间和虚函数 1.1 对象空间 在我们为对象分配一块空间时,例如: CChild1 *pChild = new CChild1(); 这块空间里放着什么东西? 在CChild1没有虚函数时
2007-09-09 19:46:00
1195
转载 潘凯:C++对象布局及多态实现的探索(十三)
代码中所定义类的简单说明C000:空类。C010:带普通成员函数及/或变量的顶层类。C011:带普通成员函数及/或变量的顶层类。C012:带静态成员函数及变量的顶层类。C013:从C010继承的有成员变量及覆盖父类普通成员函数的类。C014:从C011继承的空类。C015:从C010,C011继承的空类。C016:从C015继承带成员函数及/或变量的类。C020:从C010虚继承的带有自己的成员变
2007-09-08 23:41:00
1239
转载 潘凯:C++对象布局及多态实现的探索(十二)
后记 结合前面的讨论,我们可以看到,只要牵涉到了虚继承,在访问父类的成员变量时生成的代码相当的低效,需要通过很多间接的计算来定位成员变量的地址。在指针类型转换,动态转型,及虚函数调用时,也需要生成很多额外的代码来调整this指针。象前一篇中对C170对象的obj.foo()和obj.f170()两次调用,传递到两个函数中的this指针居然是不一样的。 前面我们碰到过的怪异行为还有很多,比如偏移
2007-09-08 23:38:00
1395
转载 潘凯:C++对象布局及多态实现的探索(十一)
菱形结构的虚继承(3) 最后我们看看,如果在上篇例子的基础上,子类及左、右父类都各自定义了自己的虚函数,这时的情况又会怎样。struct C140 : public virtual C041{ C140() : c_(0x02) {} virtual void foo() { c_ = 0x11; } char c_;};struct C160 : public virtual
2007-09-08 23:36:00
1128
转载 潘凯:C++对象布局及多态实现的探索(十)
菱形结构的虚继承(2) 我们再看一个例子,这个例子的继承结构和上一篇中是一样的,也是菱形结构。不同的是,每一个类都重写了顶层类声明的虚函数。代码如下:struct C041{ C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_;};struct C140 : public virtual C041{
2007-09-08 23:35:00
1195
转载 潘凯:C++对象布局及多态实现的探索(九)
菱形结构的虚继承 这次我们看看菱形结构的虚继承。虚继承的引入本就是为了解决复杂结构的继承体系问题。上一篇我们在讨论虚继承时用的是一个简单的继承结构,只是为了打个铺垫。 我们先看看这几个类,这是一个典型的菱形继承结构。C100和C101通过虚继承共享同一个父类C041。C110则从C100和C101多重继承而来。struct C041{C041() : c_(0x01) {}virtual
2007-09-08 23:32:00
1310
转载 潘凯:C++对象布局及多态实现的探索(八)
普通的虚继承 下面我们来看虚继承。首先看看这C020类,它从C010虚继承:struct C010{ C010() : c_(0x01) {} void foo() { c_ = 0x02; } char c_;};struct C020 : public virtual C010{ C020() : c_(0x02) {} char c_;}; 运行如下代码
2007-09-08 23:30:00
1368
转载 潘凯:C++对象布局及多态实现的探索(七)
构造函数中的虚成员函数调用 在构造函数中调用虚成员函数,虽然这是个不很常用的技术,但研究一下可以加深对虚函数机制及对象构造过程的理解。这个问题也和一般直观上的认识有所差异。先看看下面的两个类定义。struct C180{C180() { foo(); this->foo();}virtual foo() {cout }};struct C190 : public C180{C190() {
2007-09-08 23:29:00
1619
转载 潘凯:C++对象布局及多态实现的探索(六)
虚函数调用 我们再看看虚成员函数的调用。类C041中含有虚成员函数,它的定义如下:struct C041{ C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_;}; 执行如下代码:C041 obj;PRINT_DETAIL(C041, obj)PRINT_VTABLE_ITEM(obj, 0, 0)
2007-09-08 23:27:00
1402
转载 潘凯:C++对象布局及多态实现的探索(五)
普通成员函数的调用 从这部分开始我们除了利用内存的信息打印来进行探索外,更多的会通过跟踪和观察编译器产生的汇编代码来理解编译器对这些语言特性的实现方式。汇编方面知识的讨论超出了本文的范围,我只对和我们讨论相关的汇编代码进行解析。理解本文要讨论的知识并不需要有很完整的汇编知识,但必须了解起码的概念。 下面我们看看引入虚继承后的影响。为了有所对比我们首先看看普通成员函数的调用情况。 执行如下
2007-09-08 23:25:00
1228
转载 潘凯:C++对象布局及多态实现的探索(四)
类型动态转换和类型强制转换 为了验证前面提到过的类型动态转换(即dynamic_cast转换),以及对象类型的强制转换。我们利用前面定义的C041、C042及C082类来进行验证。 运行下列代码:c082.C041::c_ = 0x05;PRINT_VTABLE_ITEM(c041, 0, 0)PRINT_DETAIL(C041, ((C041)c082))PRINT_VTABLE_ITEM(
2007-09-08 23:21:00
1259
转载 潘凯:C++对象布局及多态实现的探索(三)
带虚函数的类的对象布局(2) 接下来我们看看多重继承。定义两个类,各含一个虚函数,及一个数据成员。再从这两个类派生一个空子类。struct C041{ C041() : c_(0x01) {} virtual void foo() { c_ = 0x02; } char c_;};struct C042{ C042() : c_(0x02) {} virtual v
2007-09-08 23:19:00
1113
转载 潘凯:C++对象布局及多态实现的探索(二)
带虚函数的类的对象布局(1) 如果类中存在虚函数时,情况会怎样呢?我们知道当一个类中有虚函数时,编译器会为该类产生一个虚函数表,并在它的每一个对象中插入一个指向该虚函数表的指针,通常这个指针是插在对象的起始位置。所谓的虚函数表实际就是一个指针数组,其中的指针指向真正的函数起始地址。我们来验证一下,定义一个无成员变量的类C040,内含一个虚函数。struct C040{ virtual
2007-09-08 23:16:00
1243
转载 潘凯:C++对象布局及多态实现的探索(一)
前言 本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等。 写这篇文章源于我在论坛上看到的一个贴子。有人问VC使用了哪种方式来实现虚继承。当时我写了一点代码想验证一下,结果发现情况比我想象的要复杂。所以我就干脆认真把相关的问题都过了一遍,并记录成本文。 我对于C++对象模型的知识主要来自于Lippman的书《Inside
2007-09-08 23:13:00
1360
转载 TCP三次握手在linux内核中的实现
TCP三次握手在linux内核中的实现 以下基于linux内核2.4.0源码(转自www.yuanma.org/) 以前一直使用的网络通讯的函数都是工作在阻塞模式。在看connect实现源码时,突然想到tcp/ip的三次握手在内核如何实现的,尤其是在非阻塞模式下式,涉及到等待对端回送ack包,而本端又要立即返回,想来这种实现肯定是遵循某种规则或是将所有的相关函数组
2007-04-05 23:00:00
3140
原创 虚拟机使用功略(一) 怎样在Windows XP中安装虚拟网卡
些大型设计软件如Pro/E ,UG 等都基于网络的,对电脑的软硬件的要求比较高.软件方面,它必须运行在NT结构的操作系统中(Win2000,WinXP,Win2003),硬件上还要求电脑安装有网卡.那么,假如一台高配置的电脑并安装有适合的操作系统,而只因为少装了一块网卡,就成为无法安装这些软件的瓶颈吗?解决这问题的方法还是有的,只需点点鼠标,你的电脑就能不花分文多了一块网卡了. 现在和我一
2007-02-25 21:51:00
4388
转载 TCP/IP 网络基础 (v 0.2b)
作者:北南南北来自:LinuxSir.Org目录1、TCP/IP 概述;1.1 什么是IP、ARP、ICMP、UDP;1.2 TCP/IP 网络模型;2、IP地址、网络类型、网络切割;2.1 IP 地址概说;2.2 网络分类;2.21 A类网络:2.22 B类网络:2.23 C类网络:2.24 保留地址;2.3 网络切割
2007-02-25 13:58:00
1068
原创 组合类型的优化
1.结构:(1)内存的考虑: struct A{ char a; long b; char c; long d;}; struct B{ char a; char c; long b; long d;}; #pragma pack(push,1) // 1 就是sizeof(char)的值 struct C{ char a; long b; c
2006-04-04 15:48:00
1286
原创 类从结构继承的一个问题
Struct A{ ... }; Class MyClass : public A { MyClass(); virtual ~MyClass();//用virtual有时会出错,因为它在内存中会添加一个虚函数表,造成 //内存地址出错。 }
2006-04-04 15:43:00
1069
转载 C/C++头文件一览
C/C++头文件一览C、传统 C++#include //设定插入点#include //字符处理#include //定义错误码#include //浮点数处理#include //文件输入/输出#include //参数化输入/输出#include //数据流输入/输出#include //定义各种数据类型最值常量#i
2006-04-04 15:40:00
893
原创 用字符串数组实现的大数运算
/*写了一个计算大数四则运算的类(乘法和除法并为写出来,读者可以自己相似推导).这个类的思想是用字符串数组表示大数,这并不是最好最有效的方法,but it works :)I_Love_CPP*/class CLargeNumberS{public: CLargeNumberS(char* pStr){ m_pStrIn = pStr; m_pStrOut = NULL; m_nLen
2006-03-16 19:24:00
2226
原创 Windows 映射模式
Windows 映射模式 I_Love_CPP一、 映射模式这是一个初级话题,但好像很多人都没有弄明白,因为几乎每过几天就用人发帖问这个。半年前有人问我这个问题时就想写这篇文章了,但一直觉得没有时间(因为除了学习、工作和玩耍,几乎就没有多
2005-03-14 21:00:00
2664
2
原创 Play With MFC(1) 让工具栏“召之即来,挥之即去”
让工具栏“召之即来,挥之即去”前言:工具栏设计的目的就是为了使用方便;但是人的“懒欲”是无穷的:当我们在视图区工作的时候,要伸手去点工具栏往往都觉得那是“三万一英尺的距离”。于是,动态菜单成了大家的宠儿。但它工具栏凭什么就不能像动态菜单一样“召之即来,挥之即去”??大家都是窗口,凭什么你一定要高高在上?!!因此,有了本文的戏耍工具栏。方法:1、首先,在主框架类CMainFrame类声明一个publ
2005-01-29 03:26:00
1732
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人