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/

  • 相关阅读:
    [转]double free or corruption (!prev): 0x080644c8 ***
    linux sleep用法
    ubuntu的终端下修改IP、MAC、DNS及GATE
    jmeter mina2总结
    double free or corruption (!prev): 0x080644c8 ***
    jmeter最简单使用
    超级详细Tcpdump 的用法
    eclipse下打开jmeter源码
    Jmeter 命令行选项目录
    JavaScript的一些实用技巧收藏
  • 原文地址:https://www.cnblogs.com/SkyMouse/p/2481258.html
Copyright © 2011-2022 走看看