c++对象模型以及内存布局的研究
先引出问题,看一段代码:
#include <iostream>
using namespace std; class A { }; class B {
public:
B() {}
~B() {}
}; class C {
public:
C() {}
~C() {}
void foo() {}
} class D {
public:
D() {}
virtual void foo() {}
}; class E : public D{
public:
virtual void foo() {}
}; int main()
{
A a;
cout << sizeof(a) << endl; B b;
cout << sizeof(b) << endl; C c;
cout << sizeof(c) << endl; D d;
cout << sizeof(d) << endl; E e;
D *pd = &e;
}
这样的三个类的结果都是:1,由此我写出我的几个问题:
(1)对于类A来说,整个类是空的,也就是说不会占用内存,所以sizeof(A)应该是0,但是为什么结果是1?
(2)对于类A和类B来说,在类B里面我们添加了构造函数和析构函数,为什么结果仍然是1呢?
(3)C++对象模型是什么以及如何在内存里布局呢?
(4)对于类D来说,为什么加入一个虚函数foo()结果就是8了呢(x86_64)?
(5)对于类E来说,为什么通过pd->foo()就能调到E的foo()呢?
对于这4个问题,我觉得他们其实就是跟C++模型有关系?
还没写完先保存一下
c++对象模型以及内存布局的研究的更多相关文章
- 图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看. 本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有 ...
- 好文章系列C/C++——图说C++对象模型:对象内存布局详解
注:收藏好文章,得出自己的笔记,以查漏补缺! ------>原文链接:http://blog.jobbole.com/101583/ 前言 本文可加深对C++对象的内存布局.虚表指针.虚 ...
- 【转载】图说C++对象模型:对象内存布局详解
原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在 ...
- c++对象模型是什么,对象的内存布局和结构问题
在c++发明的初期对于c++对象模型的争论从来没有停止过直到标准委员会通过了最终的c++对象模型这件事情才变得尘埃落定.C++对象模型可能是最不需要去解释的,但是又是不得不去说的因为c++的入门最先接 ...
- C++对象模型:单继承,多继承,虚继承,菱形虚继承,及其内存布局图
C++目前使用的对象模型: 此模型下,nonstatic数据成员被置于每一个类的对象中,而static数据成员则被置于类对象之外,static和nonstatic函数也都放在类对象之外(通过函数指针指 ...
- 【C++对象模型】使用gcc、clang和VC++显示C++类的内存布局
引言 各种C++实现对C++类/对象的内存布局可能有所不同,包括数据成员的顺序.虚函数表(virtual table: vtbl)的结构.继承关系的处理等.了解C++类/对象的布局,对于理解C++各种 ...
- c++ 对象内存布局详解
今天看了的,感觉需要了解对象内存的问题.参考:http://blog.jobbole.com/101583/ 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个 ...
- HotSpot源码分析之C++对象的内存布局
HotSpot采用了OOP-Klass模型来描述Java类和对象.OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象的具体类型.为了更好理解这个模型, ...
- c++继承中的内存布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的.看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用. ——谈VC++对象模型(美)简.格雷程化 译 译者前言 一个C ...
随机推荐
- vi命令的使用
<转:http://linux.vbird.org/linux_basic/0310vi.php> 基本上 vi 共分为三种模式,分别是『一般模式』.『编辑模式』与『指令列命令模式』. 圖 ...
- .nil? .empty? .blank? .present? in Ruby on Rails
We get confused when there are many options to choose from. Same is the case when it comes to use an ...
- esriSRGeoCSType Constants
ArcGIS Developer Help (Geometry) esriSRGeoCSType Constants See Also esriSRGeoCS2Type Constants ...
- List<Object>和List<String>
下面的代码在JAVA中是不可以的: import java.util.*; public class Test { public static void main(String[] args) { L ...
- java中整数类型(short int long)的存储方式
在java中的整数类型有四种,分别是 byte short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1.基本类型:short 二进制位数:16包装 ...
- Winista.Text.HtmlParser; 获取html
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- springMVC3 ckeditor3.6 图片上传 JS回调
一.引入js文件 <script type="text/javascript" src="<%=base %>/resources/ckeditor/c ...
- 64位Linux编译hadoop-2.5.1
Apache Hadoop生态系统安装包下载地址:http://archive.apache.org/dist/ 软件安装目录:~/app jdk: jdk-7u45-linux-x64.rpm ha ...
- 死锁及oracle死锁--转载
今天看群里在讨论数据库死锁的问题,也一起研究了下,查了些资料在这里总结下. 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. ...
- windows常用运行命令收集(持续更新)
快捷键打开运行窗口:Windows + R > calc(计算器) > gpedit.msc(本地组策略编辑器) > regedit(注册表) > mstsc(远程桌面) &g ...