【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系统中最多可分配多 ...
随机推荐
- mac os去除去除.DS_Store文件--使用python和go(原创)
.DS_Store (英文全称 Desktop Services Store)是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件,目的在于存贮文件夹的自定义属性,例如文件们的图标位置或者是背景 ...
- .NET开发Windows Service程序 - Topshelf
在实际项目开发过程中,会经常写一些类似定时检查,应用监控的应用.这类应用在windows平台通常都会写成window service程序. 在百度上搜索一下'c#开发windows service', ...
- MySQL显示连接的数据库名
在默认下,MySQL在use databasename的时候,是不显示连接的库名! mysql> show databases;+--------------------+| Database ...
- suse linux 操作系统下打BASH补丁
1.检查当前版本信息: bash -version echo $BASH_VERSION 2.打4.3版本的补丁 在tmp目录下(保险起见,空间至少要100M以上)新建一个bash_upgrade ...
- [转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等
[转]宏的高级使用--##,__VA_ARGS__, __FILE__, __FUNCTION__等 http://blog.csdn.net/yiya1989/article/details/784 ...
- MongoDB工具MagicMongoDBTool
MagicMongoDBTool工具是一款MongoDB的数据库管理工具,用来进行简单的数据库管理工作. 此工具为国人开发,项目地址:MagicMongoDBTool,目前作者已经完成基本功能开发. ...
- 怎么查看其它apk里面的布局代码及资源
今天才看到的好方法, 将你要的apk文件的后缀名改为zip,解压就可以了. --------------------------------- 提示:有时候系统会自动隐藏你的后缀名的,这时候就需要你将 ...
- ios 框架学习笔记
ios主要的系统层次: 一.Cocoa Touch 层:创建应用程序主要使用的框架. 1.关键技术: AirDrop:实现应用间通信. Text Kit:处理文本和排版. UIKit Dynamics ...
- UVA 11149 Power of Matrix 快速幂
题目链接: http://acm.hust.edu.cn/vjudge/contest/122094#problem/G Power of Matrix Time Limit:3000MSMemory ...
- Matlab中cellfun函数的使用
Compute the mean of each vector in cell array C. C = {1:10, [2; 4; 6], []}; averages = cellfun(@mean ...