C++类实例化的内存分布

李小嘉 发布于 2015/10/11 14:37
阅读 394
收藏 0

class A

{

public:

    char a;

    int b;

    static int n;

    void func();

protected:

    char c;

    int d;

private:

    char e;

}

main()

{

    A myclass;

    cout<<"size="<<sizeof(myclass)<<endl;

}

请问size等于多少?

那位大牛帮我分析下myclass对象中的内存分布(变量abcdn存储在那个内存区?函数的存储在内存中又是怎样分布的)

以下是问题补充:

@李小嘉:刚开始接触C++ (2015/10/11 18:26)
加载中
1
首席撸肾虚
首席撸肾虚
看字节对其了,静态和成员函数不算在sizeof里
1
大梦1107
大梦1107

@王洪旭 说的没错,不同编译器可能对应不同布局。

简单来说a,b,c,d,e属于myclass,在main()的栈桢上。n在静态全局区,因为对象共享。func()函数也在栈上但不属于myclass对象,它离main()的地址不远,对它的调用直接call symbol。

你的问题,myclass实际size为a+b+c+d+e = 1+4+1+4+1 = 11,字节对齐结果是20.

王洪旭
王洪旭
赞一个,我都忘差不多了
0
王洪旭
王洪旭

你这个问题就比较高深了,不同的编译器会有不同的结果,建议你看看这本书,能找到你要的答案

c++反汇编与逆向分析技术揭秘

0
西昆仑
西昆仑
打印出成员的地址,不就可以看出来了吗
0
G
GUOPINGBO
建议不要学C++了,它的历史包袱太沉重。切记只是建议。
大梦1107
大梦1107
回答不了问题别扯别的,历史包袱在哪里
0
Force武装卫队
Force武装卫队
字节对齐 还有虚表 静态成员和函数不算在里面,
0
木兰宿莽
木兰宿莽
不同编译器会有所不同,不过好像可以加入#pragrma pack(n)来指定内存对齐的具体方式,从而消除不同编译器带来的不兼容的现象,望采纳,谢谢
大梦1107
大梦1107
#pragrma pack(1)结果是11,但这并不是问题关键;而且也与兼容性无关,与内存映像的组织方式有关
返回顶部
顶部