C++用new与不用new创建对象的区别
2024-09-07 08:39:32
C++创建对象
一、Alignment问题
重新发现这个问题是因为在体系结构课上提到的一个概念,alignment对齐的概念。
class MyClass {
public :
char c; // 1 byte
int i; // 4 byte
};
像上面这个C++的类,它有两个变量。
MyClass myclass;
cout << sizeof(myclass) << endl;
或者直接算它的大小
cout << sizeof(MyClass) << endl;
然后按照道理,myclass的大小,应该是5 byte才对,可是最后输出的结果是8,显然这就说明系统在创建对象的时候,将对象的变量进行了对齐操作,不足4 byte的按照4 byte补足。
2.1 虚函数引起的空间占用:虚函数管理
此外,普通成员函数不会占用对象空间的大小,也不会影响sizeof的结果。
而如果是虚函数就会占用空间了。
class MyClass {
public :
char c; // 1 byte
int i; // 4 byte
void func();
virtual void func2() //4 byte
{}
};
结果是占用12 byte的大小。
这种的差别是由于c++的类所有的虚函数都是由一个虚函数指针所管理,它的虚函数被放在别的内存空间中管理。而普通函数是由this指针所管理,this指针并不是对象本身的一部分,所以不会影响到sizeof的结果。
2.2 一些有趣的现象
- 空类的sizeof为1
- 只有一个char的类的大小为1
- 当有一个为char,另一个是虚函数或者int类型成员变量,会出现对齐现象,大小为8。对齐现象很有意思,它的规则是:以最长的变量长度为对齐长度。
class MyClass {
public :
char c; // 1 byte
long long t;
};
long long为8 byte,所以总共占用16 byte。
在分析完各种情况之后,只有第一个的结果显得特别诡异,为什么空类的大小不是0,而是1?
每个类的实例,在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。------《深度探索c++对象模型》
二、用new与不用new创建对象的区别
内存分配有三种方式:
- 从静态存储区域分配,内存在编译期间就已经分配好,这块内存在整个运行期间都存在,例如static变量。
- 从栈上创建:函数内局部变量,自动分配与回收,效率高,但是分配的内存量有限。
- 从堆上创建:由程序员控制,malloc、new,free、delete。
最新文章
- Android之图片加载框架Fresco基本使用(二)
- Win10环境下安装theano并配置GPU详细教程
- Mybatis添加返回主键ID
- Linux学习:用yum安装php,httpd,mysql
- Rhythmbox中文乱码
- QQLogin
- 分享:JS比较两个日期大小
- 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子
- SQL Server是如何让定时作业
- leetcode169——Majority Element (C++)
- Bloom Filter 算法具体解释
- Memcached源码分析之请求处理(状态机)
- 深度学习系列 Part (1)
- Mysql遇到 is marked as crashed and should be repaired 问题解决方法
- 2019清明期间qbxt培训qwq
- python selenium 定制启动Chrome的选项注意事项(十九)
- Grails 第一课
- LibreOJ 6281 数列分块入门5
- 【bzoj3992】 SDOI2015—序列统计
- sklearn学习_01
热门文章
- 2019牛客国庆集训派对day3 买一送一
- 在阿里云CentOS服务器上安装Python3.7并设置为默认Python
- ent facebook 开源的golang orm 框架
- 如何使用Processing获取图片中每一个像素的坐标
- RMQ问题(超详细!!!)
- 【11NOIP提高组】选择客栈(信息学奥赛一本通 1546)(洛谷 1311)
- CSS样式的引入方式
- 拼多多面试真题:如何用 Redis 统计独立用户访问量!
- Intellij idea利用Statistic插件统计项目代码行数
- SpatiaLite, load spatial extension first