zoukankan      html  css  js  c++  java
  • sizeof empty class object

    许久没有回头研究c++的一些概念了,突然被一道题考住了大体上如下

    class a

    {}

    //...

    a aobj;

    size_t aobjSize = sizeof(aobj);

    //问aobjSize等于多少?

    个人以为aobjSize=4;

    毕竟需要有地址空间来储存,而已一般来说每一个对象都有一个this指针所以虽然没有任何成员变量但是仍然应该为4

    事实并非如此,写了一下代码发现为1

    而且反汇编之后代码如下

    ...

    00031758 mov dword ptr [ebp-4],0
    size_t dwSize = sizeof(clsObj);
    0003175F mov dword ptr [ebp-24h],1//sizeof(aobj)为什么直接就是1呢?

    ...

    沿着这个问题网上google了一下发现如下:

    一、简单对象的存储

    1、   基本类型对齐原则:

    Char            1

    Short          2

    Int              4

    Long            4

    Float            4

    Double        8

     

    2、   结构体类型对齐原则:(参见《结构体对齐》一文)

    以最大成员类型的对齐方式为准,即当需要增长时,增长最大成员类型所占用的字节数

     

    3、   静态成员变量不占用类对象的存储空间原则static

    静态成员变量所有的类对象共享一份,在静态区域中,并不占用类对象的空间。

     

    4、 没有任何成员变量的类对象占用一个字节的空间

    对于没有任何成员变量的类(空类),其实它并不是空的,它隐含着被编译器添加了一个char。因为实例化的原因(空类同样可以被实例化),每个实例在内存中都必须有一个独一无二的地址。因此,编译器会给一个空类隐含的加一个字节,使空类在实例化后在内存得到独一无二的地址。

     

    原来如此,编译器后台判断出来为空对象之后直接赋予一个char大小的空间,如此sizeof(EmptyClassObject)自然为1

    汗那个汗啊。。。

    参考网址如下:

    http://blog.163.com/niwei_258/blog/static/1062848820109284914229/

  • 相关阅读:
    Charles的使用教程
    Sublime Text 3 无法使用package control安装插件解决办法
    sublime常用快捷键整理(未完待续)
    常用 Git 命令清单
    js判断的执行顺序
    使用CSS3 Media Queries实现网页自适应(转)
    移动前端开发之viewport的深入理解(转)
    javascript之函数节流
    String常用方法总结
    腾讯面试题1
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2481258.html
Copyright © 2011-2022 走看看