【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
mq:4
p:4
分析
q是数组名,申请内存是编译器记住了,但是赋值给mq后,mq和p一样是一个普通的指针了,大小为4.
总之:c/c++没有办法知道指针所指的内存容量,除非在申请时记住它。
2. 类的内存分配
2.1 空类
#include <iostream>
using namespace std; class A
{
}; int main()
{
A a;
cout << sizeof(a) << endl;
}
结果
1
分析
所谓类的实例化就是在内存中分配一块地址(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.因为如果空类不隐含加一个字节的话,则空类无所谓实例化了(因为类的实例化就是在内存中分配一块地址。
2.2 类只有成员变量
#include <iostream>
using namespace std; class A
{
public:
int val;
}; int main()
{
A a;
cout << sizeof(a) << endl;
}
结果
4
解释
这个4是int类型类的成员变量所占字节数
2.2 类含有成员函数
#include <iostream>
using namespace std; class A
{
public:
A(int value) : val(value) {}
int val;
}; int main()
{
A a();
cout << sizeof(a) << endl;
}
结果
4
分析
这个4是int类型类的成员变量所占字节数。即成员函数没有占空间。原因是这样的:成员函数不属于类(或类的对象),所有的成员函数和全局函数都在代码段,在调用成员函数时,会隐式的通过this指针过去调用。
3.3 类中含有静态成员
#include <iostream>
using namespace std; class A
{
public:
A(int value) : val(value) {}
int val;
static int sta_val;
};
int A::sta_val = ; int main()
{
A a();
cout << sizeof(a) << endl;
}
结果
4
分析
这个4仍然是int类型类的成员变量所占字节数。static变量存放于静态区,并不和普通成员变量(存于栈)放在一起。
3.4 类中含有virtural函数
#include <iostream>
using 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 ,会增加一个虚函数表指针(即使有多个虚函数,也仅有一个虚函数表),例证
#include <iostream>
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;
}
结果
8
3.5 子类空间分配
例子1
#include <iostream>
using namespace std; class A
{
public:
int val;
}; class B : public A
{
int valb;
}; int main()
{
B b;
cout << sizeof(b) << endl;
}
结果
8
例子2
#include <iostream>
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;
}
结果
12
分析
4 + 4 + 4(虚函数表指针)
【c/c++】内存分配大小的更多相关文章
- SQLite剖析之动态内存分配
SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性 SQLite内核和它的内存分配子系统提供以下特性 ...
- Java内存分配和GC
Java内存分配和回收的机制概括的说,就是:分代分配,分代回收. 对象将根据存活的时间被分为:年轻代(Young Generation).年老代(Old Generation).永久代(Permane ...
- iOS开发——C篇&动态内存分配
再C语言中关于内存是一个很重要的知识点,所以今天我就从c语言的内存分配开始为大家解析一下C语言再iOS开发中非常重要的一些知识. 1:malloc函数的介绍 C语言中开辟内存空间:malloc函数 再 ...
- STM32动态内存分配需要注意的地方
STM32进行动态内存分配是需要注意动态内存分配大小不要超过.S文件中设置Heap Size大小 如图所示: 0x4000 :可以分配得最大字节是16384bytes 这个地方malloc的大小超过了 ...
- Go语言内存分配(详述 转)
一.内存管理简介 1.1 虚拟内存 虚拟内存是当代操作系统必备的一项重要功能,对于进程而言虚拟内存屏蔽了底层了RAM和磁盘,并向进程提供了远超物理内存大小的内存空间.我们看一下虚拟内存的分层设计. 上 ...
- Android中App可分配内存的大小
现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多少内存空间,我们使用了真机进行测试,测试机型为魅族MX4 Pro,3G内存. 测试方法是直接申请一块较大的内存空间,看应 ...
- 分配粒度和内存页面大小(x86处理器平台的分配粒度是64K,内存页是4K,所以section都是0x1000对齐,硬盘扇区大小是512字节,所以PE文件默认文件对齐是0x200)
分配粒度和内存页面大小 x86处理器平台的分配粒度是64K,32位CPU的内存页面大小是4K,64位是8K,保留内存地址空间总是要和分配粒度对齐.一个分配粒度里包含16个内存页面. 这是个概念,具体不 ...
- Virtualbox修改虚拟机分配内存的大小
起因:因为虚拟机刚开始分配的内存太小,导致太卡, 解决方法:修改虚拟机分配内存的大小 方法一:必须在关闭ubuntu的前提下进行,否则无法修改 点击设置 系统选项 主板中的内存大小 之后开启即可 方法 ...
- Android中App可分配内存的大小(转)
转自:http://blog.csdn.net/u011506413/article/details/50965435 现在真实测试结果: 1,为了搞清楚每个应用程序在Android系统中最多可分配多 ...
随机推荐
- Wpf从资源中重用UI元素
在我的界面上有几个选项卡,每个选项卡中都有下面的元素: <StackPanel Orientation="Horizontal"> <Button Content ...
- N个顶点构成多边形的面积
Input 输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1 ...
- 轻量级远程调用框架-Hessian学习笔记-Demo实现
Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协 ...
- SQL左连接、右连接和内连接的简单示例
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: inner join(等值连接 ...
- 7、XAML的编译过程
对于动态皮肤场景来说,在运行时加载和解析XAML是有意义的,对于那些没有支持XAML编译的.NET语言也是有意义的.但大多数WPF项目会通过MSBuild和Visual Studio完成XAML编译. ...
- Linux磁盘与文件系统管理
df df(disk free) 功能说明:显示磁盘的相关信息.语 法:df [-ahHiklmPT][--block-size=<区块大小>][-t <文件系统类型>][-x ...
- Redis 三:存储类型之字符串
.赋值单个: [赋值多个:mset a b c ] .取值单个: get a [取值多个:mget a b c] .数字递增 incr a 在a的基础上+,那就是返回101 如果预先的值为0,那么返回 ...
- java排序集锦
java实现排序的一些方法,来自:http://www.javaeye.com/topic/548520 package sort; import java.util.Random; /** * 排序 ...
- 在线压缩zip
<?php //验证密码 $password = "test"; ?> <html> <head> <meta http-equiv=&q ...
- Yii2 composer更新后报错: Calling unknown method: yii\web\UrlManager::addRules()
网上搜了好多答案,基本上都是让你在composer.json里面添加这样一段话: "extra": { "asset-installer-paths": { & ...