
c++对象模型
文章平均质量分 71
leileicaocao
这个作者很懒,什么都没留下…
展开
-
C++对象面面观
学习C++应该看过不少关于C与C++的口水贴,以及关于各种对比C与C++效率比较的帖子, 最有影响力的恐怕当属linus对C++的炮轰——《糟糕程序员的垃圾语言》。但无论如 何,我正喜欢着这样一种垃圾,我当然对linus充满敬意,但这不妨碍我口食垃圾而对其 仰慕。无需太在意站在山巅的巨人们的言论,每个人都有不同的道路来追求真理。与其听着Linus 的嗤笑之声,不妨跟随Lippman一起探索转载 2013-05-20 13:40:02 · 616 阅读 · 0 评论 -
VC内存对齐准则(Memory alignment)
本文所有内容在建立在一个前提下:使用VC编译器。着重点在于:VC的内存对齐准则;同样的数据, 不同的排列有不同的大小,另外在有虚函数或虚拟继承情况下又有如何影响?内存对齐?!What?Why?对于一台32位的机器来说如何才能发挥它的最佳存取效率呢?当然是每次都读4字节(32bit), 这样才可以让它的bus处于最高效率。实际上它也是这么做的,即使你只需要一个字节,它也是 读一个机器转载 2013-05-20 13:44:20 · 689 阅读 · 0 评论 -
new expression、operator new和placement new——三个“妞(new)”的故事(3)
placement operator newplacement operator new用来在指定地址上构造对象,要注意的是,它并不分配内存,仅仅是 对指定地址调用构造函数。其调用方式如下:point *pt=new(p) point3d;观其名字可知,它是operator new的一个重载版本。它的实现方式异常简单,传回一个指针即 可:void* opera转载 2013-05-21 09:03:08 · 578 阅读 · 0 评论 -
模板二事
模板的实例化一个模板只有被使用到,才会被实例化,否则不会被实例化。对于一个实例化 后的模板来说,未被调用的成员函数将不会被实例化,只有成员函数被使用时, C++标准才要求实例化他们。其原因,有两点:空间和时间效率的考虑,如果模板类中有100个成员函数,对某个特定类型 只有2个函数会被使用,针对另一个特定类型只会使用3个,那么如果将剩 余的195个函数实例化将浪费大量的时间和空间。使转载 2013-05-21 09:04:16 · 448 阅读 · 0 评论 -
对象的构造和析构
一般而言,构造函数被安插在对象的定义处,而析构函数被安插在对象生命 周期结束前::::C++ // Pseudo C++ Code{Point point;// point.Point::Point() 一般被安插在这儿...// point.Point::~Point() 一般被安插在这儿 }当代码有一个以上的离开点的时候,析构函数则必须放在对象被构造之后的每转载 2013-05-21 09:03:39 · 549 阅读 · 0 评论 -
临时性对象(Temporary Objects)
何时生成临时对象对于一个下面这样的程序片段:T a, b;T c=a+b;死板一点来讲,它应当产生一个临时对象用来存储a+b的结果,然后以临时对 象作为初值调用拷贝构造函数初始化对象c。而实际上编译器更愿意直接调用 拷贝构造函数的方式将a+b的值放到c中,这样就不需要临时对象,和它的构造 函数和拷贝构造函数的调用了。更进一步,如果operator +的定义符转载 2013-05-21 09:03:59 · 543 阅读 · 0 评论 -
EH & RTTI
异常处理(Exception Handling)C++的 exception handling 有三个主要的子句组成:一个throw子句。它在程序的某处丢出一个exception,被丢出的exception可以是内建类 型,也可以是自定义类型。——抛出exception组件。一个或多个 catch 子句。 每一个 catch 子句都是一个 exception handler。每个子转载 2013-05-21 09:04:36 · 494 阅读 · 0 评论 -
Linux内核入门(四)—— 内核汇编语言规则
http://blog.youkuaiyun.com/yunsongice/article/details/5471099任何一个用高级语言编写的操作系统,其内核源代码中总有少部分代码是用汇编语言编写的。读 过Unix Sys V源代码的读者都知道,在其约3万行的核心代码中用汇编语言编写的代码约2000行,分 成不到20个扩展名为.s和.m的文件,其中大部分是关于中断与异常处理的底层程序,还有就是转载 2013-05-22 09:05:30 · 562 阅读 · 0 评论 -
(8)虚函数测试
#include using namespace std;void TestVirtualFunction();void TestVirtualClass();void TestDrivedClass();void TestDefaultParam();/* 1.如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数 2.如果调用虚函数,则直到运行时才原创 2013-05-23 09:22:39 · 570 阅读 · 0 评论 -
拷贝构造函数(copy constuctor)
拷贝构造函数(copy constuctor)通常C++初级程序员会认为当一个类为没有定义拷贝构造函数的时候,编译器会 为其合成一个,答案是否定的。编译器只有在必要的时候在合成拷贝构造函数。 那么编译器什么时候合成,什么时候不合成,合成的拷贝构造函数在不同情况下 分别如何工作呢?这是本文的重点。拷贝构造函数的定义有一个参数的类型是其类类型的构造函数是为拷贝构造函数。如下:转载 2013-05-20 13:41:47 · 601 阅读 · 0 评论 -
深入C++构造函数
通常很多C++程序员存在两种误解:没有定义默认构造函数的类都会被编译器生成一个默认构造函数。编译器生成的默认构造函数会明确初始化类中每一个数据成员。在读《深度探索C++对象模型》之前,我一直停留在上述二种误解上,所幸的是 Lippman为我破除了藩篱。下面的部分我将随《深度探索C++对象模型》对C++默 认构造函数一探究竟。C++标准规定:如果类的设计者并未为类定义任何构造转载 2013-05-20 13:41:02 · 452 阅读 · 0 评论 -
C++之成员函数调用
c++支持三种类型的成员函数,分别为static,nostatic,virtual。每一种调用方式都不尽相同。非静态成员函数(Nonstatic Member Functions)保证nostatic member function至少必须和一般的nonmember function有相同的效率是C++的设计准则之一。事实上在c++中非静态成员函数(nostatic member转载 2013-05-20 13:46:20 · 1033 阅读 · 0 评论 -
几点类设计原则
1.即使是一个抽象基类,如果它有非静态数据成员,也应该给它提供一 个带参数的构造函数,来初始化它的数据成员。或许你可以通过其派生 类来初始化它的数据成员(假如nostatic data member为publish或 protected),但这样做的后果则是破坏了数据的封装性,使类的维护和修 改更加困难。由此引申,类的data member应当被初始化,且只在其构造函 数或其member func转载 2013-05-20 13:47:17 · 506 阅读 · 0 评论 -
C++类对象的大小
一个实例引出的思考class X{};class Y:virtual public X{};class Z:virtual public X{};class A:public Y, public Z{};猜猜sizeof上面各个类都为多少?Lippman的一个法国读者的结果是:sizeof X yielded 1转载 2013-05-20 13:43:46 · 604 阅读 · 0 评论 -
C++对象的数据成员
数据成员的布局对于一个类来说它的对象中只存放非静态的数据成员,但是除此之外,编译器为了实现virtual功能还会合成一些其它成员插入到对象中。我们来看看这些成员的布局。C++ 标准的规定在同一个Access Section(也就是private,public,protected片段)中, 要求较晚出现的数据成员处在较大的内存中。这意味着同一个片段中的数据成员并不需要紧密相连转载 2013-05-20 13:44:48 · 750 阅读 · 0 评论 -
C++之虚函数(Virtual Member Functions)
《深度探索C++对象模型》是这样来说多态的:在C++中,多态表示“以一个public base class的指针(或引用),寻址出一个derived class object”的意思。消极多态与积极多态用基类指针来寻址继承类的对象,我们可以这样:Point ptr=new Point3d; //Point3d继承自Point转载 2013-05-20 13:46:52 · 584 阅读 · 0 评论 -
命名返回值优化和成员初始化队列
命名返回值优化对于一个如foo()这样的函数,它的每一个返回分支都返回相同的对象,编译器 有可能对其做Named return Value优化(下文都简称NRV优化),方法是以一个参 数result取代返回对象。foo()的原型:X foo() { X xx; if(...) returnxx; else转载 2013-05-20 13:42:14 · 516 阅读 · 0 评论 -
构造、复制、析构语意学
一种所谓的Plain OI’Data声明形式::::C++ struct Point { float x,y,z; };概念上来讲,对于一段这样的C++代码,编译器会为之合成一个默认构造函数、 复制构造函数、析构函数、赋值操作符。然而实际上编译器会分析这段代码, 并给Point贴上Plain OI’Data标签。编译器在此后对于Point的处理与在 C中完全一样,也就是说上述的转载 2013-05-20 13:47:41 · 613 阅读 · 0 评论 -
new expression、operator new 和 placement new——三个妞(new)的故事(1)
之前虽然一直知道有new expression、operator new和placement new,但对于这三个“new”, 却不甚了了,这些天从《深度探索C++对象模型》读到new和delete,特意结合《C++ Primer》 写下这篇笔记,以作总结。三个虽然都是“妞”(new),但每个妞都不相同各有各的特点,各 有各的风味,本文重点在于总结比较这三个“妞”,但期间也不忘提一提推倒这三个“妞转载 2013-05-20 13:48:10 · 525 阅读 · 0 评论 -
new expression、operator new和placement new——三个妞(new)的故事(2)
两个 delete 后的问题最近在网上看到两个关于指针 delete 后的问题。第一种情况:int* p = new int;delete p;delete p;// p为什么能delete两次,而程序运行的时候还不报错。第二种情况:int* p = new int ;delete p;*p = 5; //delete后对*p进行再赋值居然也可转载 2013-06-04 22:36:55 · 403 阅读 · 0 评论