首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

虚函数sizeof的有关问题,求大牛

2012-10-26 
虚函数sizeof的问题,求大牛#include iostream#include cstdiousing namespace stdstruct Base{privat

虚函数sizeof的问题,求大牛
#include <iostream>
#include <cstdio>
using namespace std;

struct Base{
private:
int i;
float a;
public:
virtual ~Base();
};

struct Derived : public Base{
private:
double c;
int d;
char e;
public:
virtual ~Derived();
};

int main() {
printf("%d\n", sizeof(Base));
printf("%d", sizeof(Derived));
return 0;
}
结果是: 12, 32
我把Derived中的char e;变量去掉后再RUN还是这个值?咋求出来的啊,没想明白那个sizeof(Drived)的值是怎么求出来的?
还有继承的时候虚函数到底怎么处理的?包括内存对齐与继承的关系?谢谢了

[解决办法]
子类里面有double 所以8字节对齐
也就是8(doubel c)+8(int d;char e)+4(virtual)=20
加上父类的12就是32
8(int d;char e)
这一部分 你去掉了char 也会是8
这就是内存对齐 和你的继承与否无关

[解决办法]
又见sizeof,
[解决办法]
建立虚函数后,自动回生成虚表,由一个指针指向这个虚表,所以要+4 ,无论有多少虚函数,只会产生一个虚表。
故第一个结果为4+4+4 = 12
再和ls的相加 = 32。
字节按高位对齐
[解决办法]
学习~~~
[解决办法]

探讨
我把
public:
virtual ~Derived();
去掉后还是那个结果?这咋解释?~~~

[解决办法]
探讨
引用:
我把
public:
virtual ~Derived();
去掉后还是那个结果?这咋解释?~~~

因为你继承了一个虚函数,所以不论你有没有再加虚函数,都需要一个指针的。
但是我觉得应该这么算的。

C/C++ code

struct Base{
private:
int i; //4
float a; //4
……

[解决办法]
同意三楼!
[解决办法]
字节对齐
[解决办法]
探讨
子类里面有double 所以8字节对齐
也就是8(doubel c)+8(int d;char e)+4(virtual)=20
加上父类的12就是32
8(int d;char e)
这一部分 你去掉了char 也会是8
这就是内存对齐 和你的继承与否无关

[解决办法]
楼上的都说的很清楚
[解决办法]
欲了解原理就自己看书《深度探索 C++ 对象模型》
[解决办法]
虚指针,还有内存对齐
[解决办法]
看看 顶起

热点排行