c/c++内存分配大小实例讲解
测试平台: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; }
结果
q:6【c/c++内存分配大小实例讲解】分析
mq:4
p:4
q是数组名,申请内存是编译器记住了,但是赋值给mq后,mq和p一样是一个普通的指针了,大小为4.
总之:c/c++没有办法知道指针所指的内存容量,除非在申请时记住它。
2. 类的内存分配
2.1 空类
#includeusing namespace std; class A{}; int main(){A a; cout << sizeof(a) << endl; }
结果
1分析
所谓类的实例化就是在内存中分配一块地址(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.因为如果空类不隐含加一个字节的话,则空类无所谓实例化了(因为类的实例化就是在内存中分配一块地址。
2.2 类只有成员变量
#includeusing namespace std; class A{public:int val; }; int main(){A a; cout << sizeof(a) << endl; }
结果
4解释
这个4是int类型类的成员变量所占字节数
2.2 类含有成员函数
#includeusing namespace std; class A{public:A(int value) : val(value) {}int val; }; int main(){A a(3); cout << sizeof(a) << endl; }
结果
4分析
这个4是int类型类的成员变量所占字节数。即成员函数没有占空间。原因是这样的:成员函数不属于类(或类的对象),所有的成员函数和全局函数都在代码段,在调用成员函数时,会隐式的通过this指针过去调用。
3.3 类中含有静态成员
#includeusing 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; }
结果
4分析
这个4仍然是int类型类的成员变量所占字节数。static变量存放于静态区,并不和普通成员变量(存于栈)放在一起。
3.4 类中含有virtural函数
#includeusing namespace std; class A{public:int val; virtual void fuc() { cout << "hello" << endl; } }; int main(){A a; cout << sizeof(a) << endl; }
结果
8分析
virtual 会增加4个字节大小的空间。原因:增加一个virtual ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表),例证
#includeusing 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; }
结果
83.5 子类空间分配
例子1
#includeusing namespace std; class A{public:int val; }; class B : public A{int valb; }; int main(){B b; cout << sizeof(b) << endl; }
结果
8例子2
#includeusing namespace std; class A{public:int val; virtual void fuc() {}}; class B : public A{int valb; }; int main(){B b; cout << sizeof(b) << endl; }
结果
Bb分析
4 + 4 + 4(虚函数表指针)
到此这篇关于c/c++内存分配大小实例讲解的文章就介绍到这了,更多相关c/c++内存分配大小内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- c++基础概念笔记
- iOS内存对齐原则
- 资金分配比例
- 牛逼!C++开发的穿越丛林真人游戏,游戏未上线就有百万人气
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 内存管理概念与原理以及解决办法