zoukankan      html  css  js  c++  java
  • C++类的内存分配

    今天面试被问到一个类的内存问题,有些记不清楚了。用了 C++这么年,实在是不应该。

    于是上网查了一些资料,并做了实验,整理如下:

    所用测试环境为64位mac air,编译器为XCode

    1.最简单

    class Test
    {
    public:
        int  a ;
    };
    printf("size=%d
    ",sizeof(Test));

    这个相信大家都能猜得到。答案是4.这个不解释。

    值得一提的是,

        Test t;
        printf("%d,%d",&t,&(t.a));

    t,和t.a的地址是一样的

    2.加上成员函数 

    class Test
    {
    public:
        int a ;
        int tt(){return 0;}
    };

    这个可能有些难度 。有人猜是4,有人猜是8,或者其它。

    这个仍然是4,原因是成员函数并不属于类(或者说对象),所有的成员函数和全局函数等,都在代码段。所以在调用成员函数时,会隐式的传个this过去,这个this作用其实就是将对象内所有成员变量传递进去。

    关于这一点,读过《Lua程序设计》的“面向对象”一章的同学,可能会有更深刻的体会。

    3.static  

    class Test
    {
    public:
        int a ;
        static int b ;
    
        int tt(){return 0;}
    };

    结果仍然是4,static 变量不占用内存??

    不是的,static 变量存放在静态区,并不和普通成员变量在一个区域,所以仍然是4.

    4.增加virtual 

    class Test
    {
    public:
        int a ;
        virtual int tt(){return 0;}
    };

    增加一个virtual ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表)

    一个有趣的问题是,一个指针占用多少个字节,是4 个字节 吗?

    不是的,其实和机器字长有关,在32位机器上是4字节,如果在64位机器上,则是8个字节 。

    所以在我的编译环境下,这个的答案应该是12

    5.继承的情况

    继承的情况下,子类的字节数就是父类加子类.

    但需要注意的一点是,子类只有一份虚函数表指针,指向的表中是父类虚函数加子类虚函数

  • 相关阅读:
    面向对象三大特性?
    final finally finalize区别?
    LeetCode122-买卖股票的最佳时机2(贪心算法)
    LeetCode119-杨辉三角2(题目有Bug,动态规划)
    九度OJ 1051:数字阶梯求和 (大数运算)
    九度OJ 1050:完数 (数字特性)
    九度OJ 1049:字符串去特定字符 (基础题)
    九度OJ 1048:判断三角形类型 (基础题)
    九度OJ 1047:素数判定 (素数)
    九度OJ 1046:求最大值 (基础题)
  • 原文地址:https://www.cnblogs.com/fox7nights/p/3446531.html
Copyright © 2011-2022 走看看