zoukankan      html  css  js  c++  java
  • C++

    类的虚函数虚继承所占的空间


    本文地址: http://blog.csdn.net/caroline_wendy/article/details/24236469


    char占用一个字节, 但不满足4的倍数时, 会进行数据对齐, 使用4的倍数的字节(byte).


    GCC:

    GCC中, 不管是虚函数还是虚继承, 都须要将指针存储在虚函数表(virtual function table), 占用4个字节.


    继承会继承基类的数据, 和虚函数表, 即继承基类的空间.


    代码:

    /*
     * test.cpp
     *
     *  Created on: 2014.04.20
     *      Author: Spike
     */
    
    /*eclipse cdt, gcc 4.8.1*/
    
    #include <iostream>
    
    using namespace std;
    
    class A {
    	char k[5];
    public:
    	virtual void aa() {};
    };
    
    class B : virtual public A {
    	char j[6];
    public:
    	virtual void bb() {};
    };
    
    class C : virtual public B {
    	char i[7];
    public:
    	virtual void cc() {};
    };
    
    int main() {
    	std::cout << "sizeof(A) = " << sizeof(A) << std::endl;
    	std::cout << "sizeof(B) = " << sizeof(B) << std::endl;
    	std::cout << "sizeof(C) = " << sizeof(C) << std::endl;
    
    	return 0;
    }
    

    输出:

    sizeof(A) = 12
    sizeof(B) = 24
    sizeof(C) = 36

    VS:

    VS中, 正常情况下, 全部虚函数都写在一个虚函数表中, 即派生类使用基类的虚函数表, 不会新建字节的虚函数表;

    假设使用虚继承, 则派生类, 新建虚函数表和虚继承表, 即额外添加8个字节(两个表);


    输出:





  • 相关阅读:
    Thread记录
    反射的学习笔记--sql语句生成
    Index was outside the bounds of the array. (Microsoft.SqlServer.Smo)
    contains 方法
    mysql connector 和 sqlserver ado.net 的区别
    javascript slice
    javascript bind
    转,SelectNodes + XPath
    jsgen 搭建
    【转】基于第一个PhoneGap(cordova)的应用详解
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3751355.html
Copyright © 2011-2022 走看看