摘要:
在前一篇,我们讨论了在多重继承情况下,具有虚函数的类的内存布局情况。本篇将进一步探索在多重虚拟继承情况下的内存布局情况。 在讨论多重虚拟继承前,我们先对《浅析GCC下C++多重继承 & 虚拟继承的对象内存布局》中的例子进行扩充。先看看带有虚函数的单一虚拟继承情况下类的内存布局。 先看例子:View Code 1 #include <iostream> 2 using namespace std; 3 4 class Top 5 { 6 public: 7 virtual void x(){cout << "top x" << en 阅读全文
2012年7月17日
摘要:
在前一篇,我们讨论了在多继承情况下,具有虚函数的类的内存布局情况。本篇将进一步探索在多重继承,即具有重复继承的情况下的内存布局情况。在阅读本篇和下一篇之前,建议先阅读本博客另一篇博文《浅析GCC下C++多重继承 & 虚拟继承的对象内存布局》。 先说一点题外话,细心的读者可能会发现,我们在探索不同情况下类的内存布局时,总是先通过查看类的大小以及其中各个成员变量的地址来进行分析,然后再具体定位某一位置的值。从最原始的内存中的对象分布,我们可以获得最深入最有效的理解。 OK,请看例子:View Code 1 #include <iostream> 2 using namespac 阅读全文
摘要:
上一篇我们讨论了在单一继承的情况下,具有虚函数的类对象的内存布局情况。本篇主要讨论在多继承情况下,对象的内存布局。 看例子:View Code 1 #include <iostream> 2 using namespace std; 3 4 class Left 5 { 6 public: 7 virtual void x(){cout << "left x" << endl;} 8 virtual void print1(){cout << "left print" << endl;} 9 p 阅读全文
摘要:
上一篇,我们讨论了带有虚函数的对象的内存布局情况。这一篇,主要讨论带有虚函数的类在单一继承情况下的内存布局情况。 还是从例子入手:View Code 1 #include <iostream> 2 3 using namespace std; 4 5 class Point 6 { 7 public: 8 int x(); 9 virtual void y(){cout << "Point y" << endl;};10 virtual void print1(){cout << "Point print" 阅读全文
摘要:
我们知道,虚函数作为C++实现多态的方式,具有强大的RTTI(RunTime Type Identification)功能。虚函数使用起来比较简单,但是也很容易出错。本系列将带着你一步一步了解虚函数的内部实现机制,在掌握原理后,我相信你会对虚函数以及C++本身会有进一步的认识和理解。 注:本系列所有的关于C++虚函数的探索都是在GCC平台上进行的。一、带有虚函数的对象内存布局 让我们先看一段代码:View Code 1 #include <iostream> 2 using namespace std; 3 4 class Test 5 { 6 public: 7 virtua.. 阅读全文
摘要:
继承是C++作为OOD程序设计语言的三大特征(封装,继承,多态)之一,单一非多态继承是比较好理解的,本文主要讲解GCC环境下的多重继承和虚拟继承的对象内存布局。一、多重继承 先看几个类的定义:View Code 1 class Top 2 { 3 public: 4 int a; 5 }; 6 7 class Left : public Top 8 { 9 public:10 int b;11 };12 13 class Right : public Top14 {15 public:16 int c;17 };18 19 cl... 阅读全文
摘要:
共享内存作为IPC(Inter-Process Communication)的一种方式,适合同一台机器上不同进程间的相互通信,由于不同进程直接对同一块"约定好"的内存进行操作,因此效率为所有IPC中最高的。 共享内存的使用还是很简单的,主要涉及到五个函数的使用,下面一一进行介绍。 (1)key_t ftok(const char *pathname, int proj_id); 功能:用来创建System V IPC的一个key值 参数:pathname:系统中真实存在的并可以访问的目录或文件 proj_id :在1~255之间的数值,... 阅读全文
摘要:
好吧,我承认我标题党了。但是我仍然建议你能够继续往下读,最多花上一分钟时间。当然,如果能够浪费你十分钟以上,我的目的便达到了,而你也会有不一样的体会。 问题:你会怎样实现min & max这两个函数呢? 我想大多数人的做法无非三种:1)定义宏;2)定义函数; 3)定义inline函数。 对于第二种方法,不用多说,功能如此单一的函数效率会有折扣;对于第三种方法,inline是在较新的C99中引入的。其实我是在找理由,我太懒了,不想讨论第二种和第三种,也是在掩饰现代编译器强悍的优化能力。也许,编译器自动为你把小函数优化成内联了呢。OK,我们这里的主题是关于宏定义的,和其他无关。请看(下.. 阅读全文
摘要:
我不得不承认,在编程的世界,无奇不有,码农的创造力是无穷的,也是妙不可言的!只要涉及到效率,永远是没有最快,只有更快! 我们知道,在标准C中,有函数int isdigit(int c)可以用来判断字符c是否为0~9之间的数字。比如:View Code 1 int a = isdigit('1'); //a == 12 int b = isdigit('a'); //b == 03 int c = isdigi 阅读全文
摘要:
在进入主题之前,这里有一个问题:在C中可以定义长度为0的数组吗? 答案是:标准的C中是不可以的,GNU C中可以。 比如定义这样一个数组:int data[0]; 使用GCC可以编译通过,而在VS下报错“cannot allocate an array of constant size 0”。 OK,下面看看怎样在GNU环境下使用长度为0的数组魔法般的定义变长结构体。这里变长不是指sizeof(struct XXX)的长度不固定,而是结构体内的变量所拥有的内存大小不固定。聪明的你也许很快就能够想到:如果在结构体中存放一个指针,然后使指针指向动态分配的内存不就可以吗?确实可以,如下:Vi... 阅读全文