`
ZeaLoVe
  • 浏览: 91711 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C++对象模型的一些问题

    博客分类:
  • C++
 
阅读更多

 

#include <iostream>
using namespace std;

class EmptyClass{};

class A
{
	virtual void show()
	{
		cout<<"A"<<endl;
	}
	virtual void Bshow(){}
	virtual ~A(){}
};
class B:public virtual A
{
	int b;
};
class C:public virtual A
{
	int c;
};
class D:public C,public B
{
	int d;
};

int main() {
	cout<<"size of EmptyClass:"<<sizeof( EmptyClass)<<endl;
	cout<<"size of A:"<<sizeof(A)<<endl;
	cout<<"size of B:"<<sizeof(B)<<endl;
	cout<<"size of C:"<<sizeof(C)<<endl;
	cout<<"size of D:"<<sizeof(D)<<endl;
	return 0;
}

 

     把这段代码解释通,就差不多可以理解C++基本对象模型了。

     可惜设计者为了避免某些问题而进行的尝试经常被使用的人忽略,导致一些误解,类的设计必然不能向人们期望的行为一样进行的。这就是折中,必要的牺牲啊。


    空类占一个Byte,这个如果不是看书我永远也不知道,至于为什么这样做,我现在也不明白。。

    只要类里出现虚函数,那么就涉及到一个vptr虚函数指针,指向一个虚函数表的。所以占用4Byte。我开始一直误解了,以为一个虚函数就是一个指针,当然一个指针指向一个表这样所占的空间少也更加合理些。内存的布局问题还涉及到占位符,就是为了方便系统快速存取所保留的字节数,默认是字段长也就是指针长度。


    虚继承的机制就有点复杂了,我现在还没搞清楚。但这里如果B和C不是虚继承自A的话,D将含有两个A里的变量,但由于我这例子A不含变量,也就没这样的问题了。


    以上只是一个开始。。。

 

12.14  不要在虚继承用的基类中声明非静态成员变量,不然就离复杂的深渊不远了。 虚继承的目的应该说是作为多重继承避免数据重复的,还有就是提供接口调用。之所以说不要这么做大部分原因是多重继承中编译器决策所调用函数时候涉及到Offset的复杂性。。我目前也一知半解,估计先记下。

 

12.15  看到了内联函数部分,然后查了一些以前不知道的关于内联的一些问题,这里列出:

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。   定义在类声明之中的成员函数将自动地成为内联函数

内联最常出现的地方就是和#define 宏进行比较,宏是预处理,无法调试。内联函数说到底还是函数调用,可以声明变量,可跟踪。但这些需要编译器进行代码转换的,简单的模型就是直接将内联函数的代码伸展,而减少函数调用时候内存和栈的开销。实际情况当然很复杂了,所以内联的使用需要非常小心,经常会遇到的问题是编译器不支持,或者临时对象开销导致得不偿失。内联是个强有力的工具,但使用起来需要注意!

 

 

 

 

分享到:
评论

相关推荐

    深度探索C++对象模型.pdf

    ### 深度探索C++对象模型:理解与解析 #### C++对象模型概览 C++对象模型是C++编程语言中一个核心且复杂的概念,它定义了如何在内存中表示类、对象以及它们之间的关系。理解C++对象模型对于深入掌握C++语言特性、...

    深度探索c++对象模型(2012版本)

    总的来说,《深度探索C++对象模型》将带领读者深入C++的核心,理解对象模型的每一个细节,这对于提升C++编程技能,解决复杂问题和优化代码性能具有极大的价值。通过阅读本书,读者将能够更好地掌握C++这一强大工具,...

    深度探索C++对象模型 PDF

    《深度探索C++对象模型》是一本专门为C++程序员量身打造的专业书籍,它深入剖析了C++语言的核心——对象模型。这本书旨在帮助开发者更好地理解C++中的内存管理、类型系统、类层次结构以及对象生命周期等关键概念。...

    深度探索C++对象模型 PDF中文清晰版

    《深度探索C++对象模型》专注于C++面向对象程序设计的底层机制,包括结构式语意、临时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这本书让你知道:一旦你能够了解底层实现模型,你的程序代码将获得...

    深度探索C++对象模型(侯捷 著)

    《深度探索C++对象模型》是侯捷翻译的一本关于C++对象模型深入探讨的专业书籍,原著作者为Stanley B. Lippman。这本书详细解析了C++中对象的内部表示、构造和析构的过程以及运行时行为等关键概念。它不仅仅是一本...

    深度探索C++对象模型(简体中文版).pdf

    特别地,本书还分析了C++对象模型在运行时的语义,以及对象模型的一些边缘问题。 C++作为一门强类型语言,它的编译器对于程序员编写的代码会做出很多“手脚”,例如自动进行内存管理、调用构造函数和析构函数、处理...

    深入探索c++对象模型 设计模式c++ pdf

    《深入探索C++对象模型》是一本深度剖析C++编程语言内部机制的著作,而设计模式则是软件工程中的一种最佳实践,是解决常见问题的模板。这两者结合在一起,为开发者提供了理解C++如何实现面向对象特性以及如何高效地...

    深度探索C++对象模型 超高清pdf

    深度探索C++对象模型 超高清

    C++对象模型总结

    C++对象模型 第1章 关于对象 第2章 构造函数语意学 第3章 Data语意学 第4章 Function语意学 第5章 构造、析构、拷贝语意学 第6章 执行期语意学 第7章 站在对象模型的尖端 第8章 C++对象模型总结 8.1 C++对象模型 8.2...

    深度探索 c++ 对象模型(pdf版)

    深度探索c++对象模型.pdf Inside The C++ Object Model专注于C++对象导向程序设计的底层机制,包括结构式语意、暂时性对象的生成、封装、继承,以及虚拟——虚拟函数和虚拟继承。这本书让你知道:一旦你能够了解...

    C++对象内存模型.pdf

    本文将通过实验和分析来探索 C++ 对象内存模型,并讨论对象内存结构、简单类型相关数据、包含虚函数类的对象内存结构、继承下的多态性等问题。 1. 实验基础 在 C++ 中,我们可以使用 sizeof 运算符来获取对象的...

    深度探索C++对象模型.pdf +清晰+完整+书签

    深度探索C++对象模型

    深度探索C++对象模型 中文pdf 英文chm

    深度探索C++对象模型 中文图片影印版pdf,比较清晰,不是那种模糊的版本,和文字版差别不大 英文清晰文字版chm 第一代C++编译器开发主管所写。如果你想成为真正的C++高手,看这本书,他为你讲述了编译器在处理各种...

    C++对象模型详解[收集].pdf

    "C++对象模型详解[收集].pdf" 这是一个关于C++对象模型的详细解释,涵盖了C++类继承内存布局、成员变量和成员函数的访问、虚继承、虚函数调用、强制转换到基类、异常处理等知识点。 首先,文章介绍了为什么需要...

    侯捷讲座:C++对象模型(PDF高清).rar

    《侯捷讲座:C++对象模型》是一份深入解析C++内部对象模型的高质量学习资料。这份PDF高清版教程由知名C++专家侯捷主讲,旨在帮助开发者深入理解C++语言的核心机制,特别是对象模型的构建和运作原理。通过这份资源,...

    C++对象模型.pdf

    《深度探索C++对象模型》这本书,由Stanley B. Lippman撰写,侯捷翻译,由华中科技大学出版社出版。本书致力于深入解析C++编译器在处理C++代码时所采取的复杂对象模型及其背后的底层机制,特别是针对构造函数、解构...

    深度探索C++对象模型

    《深度探索C++对象模型》是一本专注于C++编程语言底层机制的专业书籍,它揭示了C++对象在内存中的表示方式以及对象模型的工作原理。这本书是面向已经对C++有一定基础理解的开发者,旨在帮助他们深入理解C++的内部...

Global site tag (gtag.js) - Google Analytics