类里面的函数不占空间么 ?

fx397993401 2012-05-01 11:37:36
我定义一个类

class A
{
int i ;
public:
A(int ii ) : i(ii){}
void f(){cout << "A" <<endl;}//1
};


然后 A a(0);
cout << sizeof a ;
打印出来是4 ,即int i 所占的空间,函数f 不占空间么,
...全文
810 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
townsoft 2012-05-03
  • 打赏
  • 举报
回复
不知道这本书里面有没有详细说明,
《深入探索C++对象模型》 《inside the c++ object model》
Super6K 2012-05-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
代码区
数据区
堆区
栈区

“The sizeof operator gives the amount of storage, in bytes, required to store an object of the type of the operand.”,而类中的函数代码在“代码区”,所以sizeof返回的A类型的对象占用的内存空间不包括函数。
[/Quote]

细化一下:
代码区存储程序的代码
数据区存放全局变量和静态变量,与常量 其实可以细化为全局/静态数据区与常量数据区
栈中存放局部变量与传来的参数
堆是动态分配使用的。
类在内存里的数据连续存储,基本上就是存几个非静态成员变量与虚函数表指针(如果存在)
wmz5858 2012-05-03
  • 打赏
  • 举报
回复
类里面占空间的是成员变量,如果有虚函数的话,编译器会插入虚表指针,也占空间,如果由纯虚基类的话,看编译器的实现,可能会比+基类大,也可能会小。此外还要考虑内存对齐所浪费的空间。
ps:如果类为空,或由纯虚空基类派生出的空类的话,编译器可能会做调整,使其大小不是0.
mars_man 2012-05-02
  • 打赏
  • 举报
回复
函数最早出现的本质是什么?不就是一段共同的代码独立出来么,每个需要用到这段代码的地方只需要一个调用就可以了,而不用重复出现。
既然如此,为什么这么问呢?以为多一个对象就多一份代码出来么?
linguangliang 2012-05-02
  • 打赏
  • 举报
回复
类的多个对象共享类的函数,类中函数所占空间加载时将其放到了代码区!!,每个类的对象都会分配其非静态成员变量空间,我们可以根据对象中成员变量的不同取值确定对象的不同状态!!。sizeof(class_object)就是返回对象所占空间的大小
追求执着 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

如果把类A里面的函数改成 虚函数 sizeof 为8 , 增加的字节 就是所谓的虚函数指针所占的空间么 ?
[/Quote]
对,有虚函数的话类中会维护虚表,有一个指针进行管理和访问虚表而去访问函数!
fx397993401 2012-05-02
  • 打赏
  • 举报
回复
如果把类A里面的函数改成 虚函数 sizeof 为8 , 增加的字节 就是所谓的虚函数指针所占的空间么 ?
northcan 2012-05-02
  • 打赏
  • 举报
回复
The sizeof operator cannot be used with the following operands:

Functions. (However, sizeof can be applied to pointers to functions.)
Bit fields.
Undefined classes.
The type void.
Dynamically allocated arrays.
External arrays.
Incomplete types.
Parenthesized names of incomplete types.

fx397993401 2012-05-02
  • 打赏
  • 举报
回复
哦 了解
northcan 2012-05-02
  • 打赏
  • 举报
回复
代码区
数据区
堆区
栈区

“The sizeof operator gives the amount of storage, in bytes, required to store an object of the type of the operand.”,而类中的函数代码在“代码区”,所以sizeof返回的A类型的对象占用的内存空间不包括函数。
bsnry 2012-05-02
  • 打赏
  • 举报
回复
3 楼,fun1 的大小,是这么计算的吗??
fx397993401 2012-05-02
  • 打赏
  • 举报
回复
那sizeof 得出该class 所占空间为4的结果是正确的了?

有没有其他计算空间的函数 可以把 函数f所占的空间 计算进去
赵4老师 2012-05-02
  • 打赏
  • 举报
回复
仅供参考
//仅对VC6
#include <stdio.h>
void fun1() {
int f1=1;
printf("fun1\n");
printf("fun1\n");
}
void fun2() {
int f2=2;
printf("fun2\n");
}
void fun3() {
}
void main() {
#ifdef _DEBUG
printf("sizeof(fun1)==%d\n",*(int *)((int)fun2+1)-*(int *)((int)fun1+1));
printf("sizeof(fun2)==%d\n",*(int *)((int)fun3+1)-*(int *)((int)fun2+1));
//sizeof(fun1)==59
//sizeof(fun2)==43
#else
printf("sizeof(fun1)==%d\n",(int)fun2-(int)fun1);
printf("sizeof(fun2)==%d\n",(int)fun3-(int)fun2);
//sizeof(fun1)==32
//sizeof(fun2)==16
#endif
}
pathuang68 2012-05-01
  • 打赏
  • 举报
回复
函数的代码放在代码段。
evencoming 2012-05-01
  • 打赏
  • 举报
回复
占空间. 但是不在sizeof里面.
就像静态成员一样

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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