C++学习之旅——C++的函数所占字节
来源:互联网 发布:windows 资源监视器 编辑:程序博客网 时间:2024/05/16 04:27
先看两段代码:
代码段1:
class A
{
public:
int print(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}
输出结果:
Size of A =1
代码段2:
class A
{
public:
int print1(){ cout<<"This is A"<<endl;}
int print2(){ cout<<"This is A"<<endl;}
int print3(){ cout<<"This is A"<<endl;}
};
inr main()
{
A a;
cout << "Size of A = " << sizeof(a) << endl;
}
输出结果:
Size of A =1
对象的大小是它的数据成员所占存储空间之和,就和结构体一样。类中的函数是所有该类对象通用的方法,不算作对象的成员,因此也不算在对象的存储空间内
问题:类里面不管有多少个函数,这个类的对象只占1个字节的内存。这个字节的内存的内容是什么?是指针吗?指针不是占4个字节吗?
另外涉及到虚函数的话又不一样了。如
class A
{
public:
virtual int print(){ cout<<"This is A"<<endl;}
};
如果sizeof(A)的话,得出的是4。
原因是涉及到虚函数的实现问题。
class Class1
{
m_data1;
m_data2;
virtual vfunc1()
virtual vfunc2()
virtual vfunc3()
};
Class1对象实例
vptr
m_data1
m_data2
通过vptr指针找到虚函数表
Vtable(虚函数表)
(*vfunc1)()
(*vfunc2)()
(*vfunc3)()
Class1::vfunc1()
Class1::vfunc2()
Class1::vfunc3()
还有一点,如
class B
{
};
class B2
{
};
class C:public B
{
};
class D:public virtual B
{
};
class E:public B,public B2
{
};
sizeof(B) = 1; sizeof(B2) = 1; sizeof(C) = 1; sizeof(D) = 4; sizeof(E) = 1;
空类所占空间为一(上文以解释),单一继承的空类空间也是1,多重继承的空类空间还是1,但是虚继承涉及到虚表(虚指针),所以sizeof(D)=4。
- C++学习之旅——C++的函数所占字节
- linux学习之c语言变量所占字节数
- C++学习之旅——C++中数据类型所占的字节
- 基本数据类型所占的字节数【C/C++】
- C/C++学习 - 基本类型所占字节数
- C语言的各种数据结构所占的字节数
- C语言的数据类型所占的字节数
- c语言 输出不同类型所占的字节数
- c/c++ 各个类型所占的字节数
- C、C++数据类型所占字节数
- C各种类型变量所占字节
- C语言数据类型所占字节数
- C语言数据类型所占字节数
- C++string所占字节大小
- c中单个字符所占字节
- C语言-数据类型所占字节数
- C语言——用sizeof求结构体所占字节长度
- C语言sizeof函数和指针变量所占字节数
- 黑马程序员-----踏踏实实基础C#基础总结
- TJU Hacb knows the gift
- 在Sqlite中通过Replace来实现插入和更新
- IE中设置多选项卡
- 通过将目录服务器配置为拒绝不请求签名(完整性验证)的 SASL (协商式、Kerberos、NTLM 或摘要式) LDAP 绑定和在明 文(非 SSL/TLS 加密的)连接上执行的 LDAP 简单绑定
- C++学习之旅——C++的函数所占字节
- 今天的教训
- linux分区-df
- 记录下
- NetBeans下如何新建运行Java Web
- emacs配置
- Git使用
- 实现指定步长循环后移字符串数组算法
- 几种进程间的通信方式