zoukankan      html  css  js  c++  java
  • 对于 sizeof(class_name) 值的讨论(1)

    之前遇到过一个问题, 说是 sizeof(class_name) 的值是多少, 不解.
    But, 在看了 << inside C++ object model >> 有所理解之后, 对于这个问题我似乎得到了正确的答案, 现总结如下, 如有不妥, 望请斧正(虽说我觉得几乎没人会看我的博客吧......= =)


    对了, 追求严肃的朋友请直接跳过括号内容, 嗯......


    对于一个 class A, sizeof(A) 是什么意思呢? 类 A 的大小?
    非也, 此乃一个类实例化对象所占空间的大小 简单地说是其实例化对象的大小(这个...确实简单点了撒~)


    不说类里有啥, 先问一个类的实例化对象的大小, 这就是耍流氓, 那么问题来了, 都能有啥捏?


    1.成员变量
    1.1 static                成员变量
    1.2 non-static         成员变量
    1.2.1 build-in  类型变量
    1.2.2 引用
    1.2.3 指针
    2.成员函数
    2.0 static         成员函数
    2.1 virtual        成员函数
    2.2 non-virtual 成员函数


    清楚这些就可以确定了吗? 如果你觉得是, 那真是太天真, 因为不同的编译器都有它自己的处理(判断没有那么容易, 每个都有它的脾气~) 我采用的是VS 2013的 msvc 编译器, 好了, 上正文:


    先说 static 变量, 它们不会影响对象的大小, 因为编译器不会把他们放在类内, 而是放在 global data members 中(人家又不是你一个人的......), static函数同理(就因为它事实存在但又在本文中不值一说, 所以设为 2.0).


    至于 build-in 变量, 其占用空间大小取决于两个: 
    1) X平台上的 X编译器设定的该类型的大小 
    2)对齐, 因为对于大多数CPU来说,CPU字长的整数倍操作起来更快,因此对于这些成员加起来如果不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍(强迫症处女座的福音),此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做“补齐”(padding)。所以,C++标准紧紧规定成员的排列按照类定义的顺序,但是不要求在存储器中是紧密排列的.


    如果成员变量是引用或指针, 则不论类型, 4之.


    non-virtual 函数本身不占空间.


    virtual 函数算是值得一说, 类中的所有虚函数都保存在虚函数表中, 类中用一个指针来调用它们, 因此无论类中有多少虚函数, 其所占的空间也是 4. (这时, 机智的小明发问了: 如果是一个 static virtual 函数呢? 小明, 年21, 卒).
    用一张图来表达就是:  



    以上.

  • 相关阅读:
    NOIP201208同余方程
    NOIP模拟赛 最佳组合
    NOIP模拟赛 拓展
    CF1253E Antenna Coverage(DP)
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
    CF582E Boolean Function(DP,状态压缩,FMT)
    CF750G New Year and Binary Tree Paths(DP)
    Codeforces Round 596 题解
    AGC008E Next or Nextnext(组合计数,神奇思路)
    ARC082E ConvexScore(神奇思路)
  • 原文地址:https://www.cnblogs.com/wuOverflow/p/4098677.html
Copyright © 2011-2022 走看看