博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【c/c++】内存分配大小
阅读量:6279 次
发布时间:2019-06-22

本文共 2463 字,大约阅读时间需要 8 分钟。

测试平台:linux 32位系统

用sizeof()运算符计算分配空间大小。单位:字节

 

1. 数组名与变量名的区别

int main(){    char q[] = "hello";    cout << "q:" << sizeof(q) << endl;    char *mq = q;    cout << "mq:" << sizeof(mq) << endl;    const char *p = "hello";    cout << "p:" << sizeof(p) << endl;}

结果

1
2
3
q:6 
mq:4
p:4

分析

q是数组名,申请内存是编译器记住了,但是赋值给mq后,mq和p一样是一个普通的指针了,大小为4.

总之:c/c++没有办法知道指针所指的内存容量,除非在申请时记住它

 

2. 类的内存分配

2.1 空类

#include 
using namespace std;class A{};int main(){ A a; cout << sizeof(a) << endl;}

结果

1
1

分析

所谓类的实例化就是在内存中分配一块地址(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.因为如果空类不隐含加一个字节的话,则空类无所谓实例化了(因为类的实例化就是在内存中分配一块地址。

2.2 类只有成员变量

#include 
using namespace std;class A{ public: int val;};int main(){ A a; cout << sizeof(a) << endl;}

结果

1
4

解释

这个4是int类型类的成员变量所占字节数

 

2.2 类含有成员函数

#include 
using namespace std;class A{ public: A(int value) : val(value) {} int val;};int main(){ A a(3); cout << sizeof(a) << endl;}

结果

1
4

分析

这个4是int类型类的成员变量所占字节数。即成员函数没有占空间。原因是这样的:成员函数不属于类(或类的对象),所有的成员函数和全局函数都在代码段,在调用成员函数时,会隐式的通过this指针过去调用。

 

3.3 类中含有静态成员

#include 
using namespace std;class A{ public: A(int value) : val(value) {} int val; static int sta_val;};int A::sta_val = 3;int main(){ A a(3); cout << sizeof(a) << endl;}

结果

1
4

分析

这个4仍然是int类型类的成员变量所占字节数。static变量存放于静态区,并不和普通成员变量(存于栈)放在一起。

 

3.4 类中含有virtural函数

#include 
using namespace std;class A{ public: int val; virtual void fuc() { cout << "hello" << endl; } };int main(){ A a; cout << sizeof(a) << endl;}

结果

1
8

分析

virtual 会增加4个字节大小的空间。原因:增加一个virtual ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表),例证

#include 
using namespace std;class A{ public: int val; virtual void fuc() { cout << "hello" << endl; } virtual void fuc2() { cout << "hello" << endl; } };int main(){ A a; cout << sizeof(a) << endl;}

结果

1
8

 

3.5 子类空间分配

例子1

#include 
using namespace std;class A{ public: int val;};class B : public A{ int valb;};int main(){ B b; cout << sizeof(b) << endl;}

结果

1
8

 例子2

#include 
using namespace std;class A{ public: int val; virtual void fuc() {}};class B : public A{ int valb;};int main(){ B b; cout << sizeof(b) << endl;}

结果

1
 

分析

4 + 4 + 4(虚函数表指针)

 

本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/3694587.html,如需转载请自行联系原作者

你可能感兴趣的文章
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>
socket通信Demo
查看>>
技术人员的焦虑
查看>>
js 判断整数
查看>>
建设网站应该考虑哪些因素
查看>>
mongodb $exists
查看>>
js实现页面跳转的几种方式
查看>>
sbt笔记一 hello-sbt
查看>>
常用链接
查看>>
pitfall override private method
查看>>