C++中类所占的存储空间

#include <iostream>

using namespace std;

class A
{
    int m_a;

    int get()
    {
        return m_a;
    }

    virtual void set(int a)
    {
        m_a = a;
    }
    virtual int get(int a)
    {
        return m_a;
    }

    virtual ~A(){}
};

class B
{

};

struct C
{

};

void main()
{
    cout<<sizeof(A)<<endl;
    cout<<sizeof(B)<<endl;
    cout<<sizeof(C)<<endl;
}

分析如下:


类所占的空间 = 类成员变量所占空间 + 4(如果存在虚函数的话);


注意:


1、类成员所占的空间可能会涉及到内存数据对齐的问题,需要谨慎考虑;


1)当成员变量的长度都小于处理器位数时,所有成员变量所占的总空间一定是最长的变量所占空间的整数倍;


2)如果某一成员变量长度大于处理器位数,则以处理器的位数为对齐单位;


关于数据对齐,详见:http://blog.csdn.net/tangbo1987/article/details/6766918


2、如果类成员函数不是虚函数,则它不占空间;


3、如果成员函数中存在虚函数,则所有的虚函数保存在虚函数表中,然后类中会有一个指针指向该表;这个指针需要占用空间,所以需要 +4;

此外,空类所占的空间为1字节,因为:“一个类能够实例化,编译器就需给它分配内存空间,来指示类实例的地址;这里编译器默认分配了一个字节(如:char),以便标记可能初始化的类实例,同时使空类占用的空间也最少(即1字节)”      --引用 http://blog.csdn.net/sunboy_2050/article/details/6589999

空结构体同理。

 
时间: 2024-11-05 14:46:44

C++中类所占的存储空间的相关文章

不同编译器下的基本数据类型所占的内存大小

基本数据类型 所占的 存储空间 本篇文章主要介绍了"基本数据类型 所占的 存储空间",就是所占的内存大小,常见的基本数据类型包括int,long int,char,float,double float等. C语言各种数据类型及其在系统中占的字节和取值范围 C语言包含5个基本数据类型: void, int, float, double, 和 char. (另:C++ 定义了另外两个基本数据类型: bool 和 wchar_t.  一些基本数据类型能够被 signed, unsigned,

SQL-数据类型占空间大小

int -2^31~2^31 4 smallint -2^15~2^15 2 tinyint 0~255 1 bigint -2^63~2^63 8 float real 第7 位小数,其范围为从-3.40E -38 到3.40E +38 4 个字节 float 15 位小数 -1.79E -308 到1.79E +308 8 float[n] 表示float的精度 取1~7实际是real,占4 decimal 提供小数所需要的的实际存储空间 以2到17字节存储-2^38-1到2^38-1之间的

javascript必须知道的知识要点(二)

该文章不详细叙述各知识要点的具体内容,仅把要点列出来,供大家学习的时候参照,或者检测自己是否熟练掌握了javascript,清楚各个部分的内容. 内建对象可划分为数据封装类对象.工具类对象.错误类对象,如下. 数据封装类对象: Number对象 String对象 Boolean对象 Array对象 Object Function 工具类对象: Math对象 Date对象 RegExp对象 错误类对象: Error对象  Number对象 JavaScript 只有一种数字类型.Number,包括

sqlserver字段类型

bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint   整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值时很有用.这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的

指针、链表的原理和各类操作相关心得以及学生信息管理系统

伴随着学期末的到来,C语言程序设计这门课也接近尾声.经过前两次的教学,我们对C语言也有了深刻的了解,学习的内容也不断的加深.这次我们就学习了C语言程序设计里应用最广泛,也是最难学习的知识--链表和指针的应用. 关于指针和链表这两个的应用和上次的管理系统有着直接的关系,没有添加链表和指针的管理系统无法做到精确的查找.数据存储方面也显得不方便.所以指针和链表的作用能够直接指向你所需要的数据地址,使程序更加完善.这次我就利用指针的应用制作了一个管理员工工资等信息的程序. §1 指向结构体变量的指针变量

MsSQL的字段类型--(转载)

转载:http://www.cnblogs.com/skylaugh/archive/2006/07/31/464107.html 数据类型是数据的一种属性,表示数据所表示信息的类型.任何一种计算机语言都定义了自己的数据类型.当然,不同的程序语言都具有不同的特点,所定义的数据类型的各类和名称都或多或少有些不同.SQLServer提供了25种数据类型: ·Binary[(n)] ·Varbinary[(n)] ·Char[(n)] ·Varchar[(n)] ·Nchar[(n)] ·Nvarch

[转载] C语言细节,写的非常棒!

这篇文章主要讨论C语言细节问题.在找一份工作的时候,语言细节占的比例非常小,之前看某个贴着讨论,估计语言细节在面试中,占了10%的比重都不到,那为什么还要研究C语言的细节呢,我觉得有三个原因促使我总结这篇文章: 1. 总会有些面试官喜欢问这样的问题,尤其是偏底层开发的面试官. 2. 总有有那么两个2B同学.同事,搞两个很偏的知识点来考你,把你难倒以后,他就乐呵呵的满足了. 3. 对C语言有更加巩固的基础,增加信心,在代码出错时,可以非常肯定哪里没有错,而把精力花在真正的问题上. 1) switc

计算机网络课后答案

计算机网络课后答案 第一章?概述 1-01?计算机网络向用户可以提供那些服务? 答:?连通性和共享 ? 1-02?简述分组交换的要点. 答:(1)报文分组,加首部 (2)经路由器储存转发 (3)在目的地合并 ? 1-03?试从多个方面比较电路交换.报文交换和分组交换的主要优缺点. ?????答:(1)电路交换:端对端通信质量因约定了通信资源获得可靠保障,对连续传送大量数据效率高. (2)报文交换:无须预约传输带宽,动态逐段利用传输带宽对突发式数据通信效率高,通信迅速. (3)分组交换:具有报文交

iOS开发之c语言基础Lesson-08 指针 上课笔记 与 试题练习

1 ////////////////Lesson 08 指针 课堂笔记 与练习///////////// 2 3 //指针:本质是一个指针变量,只不过该变量用来存储地址. 4 //地址:内存单元的编号,也是一个数,只不过是以0x开头的十六进制数. 5 6 // int a = 10; 7 // int *p = &a; //定义一个指针变量,将a的地址给指针变量p:p指向a 8 // a = 20; //直接访问 9 // printf("%d ", *p); 10 // *p