请问一个类里面只有一个函数时,sizeof()为什么==1???

robertkun 2013-06-07 11:29:38
#include <iostream>
using namespace std;

class CBird_1
{
};

class CBird_2
{
int num;
};

class CBird_3
{
void func() {}
};

class CBird_4
{
int num;
virtual void func() {}
};

class CBird_5
{
void func_1() {}
void func_2() {}
virtual void func_3() {}
virtual void func_4() {}
};

int main()
{
cout<<"sizeof(CBird_1) = "<<sizeof(CBird_1)<<endl;
cout<<"sizeof(CBird_2) = "<<sizeof(CBird_2)<<endl;
cout<<"sizeof(CBird_3) = "<<sizeof(CBird_3)<<endl;
cout<<"sizeof(CBird_4) = "<<sizeof(CBird_4)<<endl;
cout<<"sizeof(CBird_5) = "<<sizeof(CBird_5)<<endl;
}

// 输出结果:
// D:\localsvn\project\test\release>test.exe
// sizeof(CBird_1) = 1
// sizeof(CBird_2) = 4 // CBrid_2里面只包含一个INT,占4个字节
// sizeof(CBird_3) = 1 // CBrid_3里面只包含一个函数, 函数是怎样分配的,它不占用空间吗???
// sizeof(CBird_4) = 8 // CBrid_4里面包含一个虚函数和一个INT,会多一个指向虚函数表的指针(4个字节)
// sizeof(CBird_5) = 4 // CBrid_5里面包含一个函数和一个虚函数,取最大的占用4个字节
...全文
406 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
always_learn 2013-06-07
  • 打赏
  • 举报
回复
编译器安插的char
always_learn 2013-06-07
  • 打赏
  • 举报
回复
类实例化具有独一无二的地址
hugett 2013-06-07
  • 打赏
  • 举报
回复
空类的大小都为1。。为了实例化的需要。。
Johnblx 2013-06-07
  • 打赏
  • 举报
回复
这个问题可以参考深入分析c++ 内存对象模型这本书。 c++的函数是不占用类对象空间的。也即是说类模型的大小只包含属性值得大小。 这是简单的类, 但是到了虚基类,以及没有属性的类,这种类的大小可能就与编译器的实现有关了吧。 比如你定义了两个类A 和 B 他们都是没有属性的,那你如何区分他们的对象a 和b.
ri_aje 2013-06-07
  • 打赏
  • 举报
回复
c++ 要求类型大小必须非零。
robertkun 2013-06-07
  • 打赏
  • 举报
回复
引用 8 楼 sccdyy226 的回复:
[quote=引用 6 楼 robertkun 的回复:] [quote=引用 5 楼 sccdyy226 的回复:] 编译器安插的char
如果说是char怎样确保它是独一无二的地址呢?[/quote] 假如像下面这样实例化: CBird_1 a, b; 不安插char的情况: a,b将具有相同的地址,因为sizeof(CBird_1) == 0, &b = &a + sizeof(CBird_1) 安插char的情况: a,b不会有相同的地址,因为sizeof(CBird_1) == 1, &b = &a + sizeof(CBird_1)[/quote] char的值是指ASCII码表里的值吗? 如果是的话,那是不是会用完? 本人比较菜,, 谢谢!
always_learn 2013-06-07
  • 打赏
  • 举报
回复
引用 6 楼 robertkun 的回复:
[quote=引用 5 楼 sccdyy226 的回复:] 编译器安插的char
如果说是char怎样确保它是独一无二的地址呢?[/quote] 假如像下面这样实例化: CBird_1 a, b; 不安插char的情况: a,b将具有相同的地址,因为sizeof(CBird_1) == 0, &b = &a + sizeof(CBird_1) 安插char的情况: a,b不会有相同的地址,因为sizeof(CBird_1) == 1, &b = &a + sizeof(CBird_1)
dahaiI0 2013-06-07
  • 打赏
  • 举报
回复
编译器滴干活。CBird_4把int 成员去掉就剩一个虚函数,size是4,因为编译器会安插一个虚指针。这根空类安插一个字节类似。
robertkun 2013-06-07
  • 打赏
  • 举报
回复
引用 5 楼 sccdyy226 的回复:
编译器安插的char
如果说是char怎样确保它是独一无二的地址呢?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧