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 一些有趣的现象

  1. 空类的sizeof为1
  2. 只有一个char的类的大小为1
  3. 当有一个为char,另一个是虚函数或者int类型成员变量,会出现对齐现象,大小为8。对齐现象很有意思,它的规则是:以最长的变量长度为对齐长度
class MyClass {
public :
char c; // 1 byte
long long t;
};

long long为8 byte,所以总共占用16 byte。

在分析完各种情况之后,只有第一个的结果显得特别诡异,为什么空类的大小不是0,而是1?

每个类的实例,在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址。------《深度探索c++对象模型》

二、用new与不用new创建对象的区别

内存分配有三种方式:

  1. 从静态存储区域分配,内存在编译期间就已经分配好,这块内存在整个运行期间都存在,例如static变量。
  2. 从栈上创建:函数内局部变量,自动分配与回收,效率高,但是分配的内存量有限。
  3. 从堆上创建:由程序员控制,malloc、new,free、delete。

最新文章

  1. Android之图片加载框架Fresco基本使用(二)
  2. Win10环境下安装theano并配置GPU详细教程
  3. Mybatis添加返回主键ID
  4. Linux学习:用yum安装php,httpd,mysql
  5. Rhythmbox中文乱码
  6. QQLogin
  7. 分享:JS比较两个日期大小
  8. 自定义实现InputFormat、OutputFormat、输出到多个文件目录中去、hadoop1.x api写单词计数的例子、运行时接收命令行参数,代码例子
  9. SQL Server是如何让定时作业
  10. leetcode169——Majority Element (C++)
  11. Bloom Filter 算法具体解释
  12. Memcached源码分析之请求处理(状态机)
  13. 深度学习系列 Part (1)
  14. Mysql遇到 is marked as crashed and should be repaired 问题解决方法
  15. 2019清明期间qbxt培训qwq
  16. python selenium 定制启动Chrome的选项注意事项(十九)
  17. Grails 第一课
  18. LibreOJ 6281 数列分块入门5
  19. 【bzoj3992】 SDOI2015—序列统计
  20. sklearn学习_01

热门文章

  1. 2019牛客国庆集训派对day3 买一送一
  2. 在阿里云CentOS服务器上安装Python3.7并设置为默认Python
  3. ent facebook 开源的golang orm 框架
  4. 如何使用Processing获取图片中每一个像素的坐标
  5. RMQ问题(超详细!!!)
  6. 【11NOIP提高组】选择客栈(信息学奥赛一本通 1546)(洛谷 1311)
  7. CSS样式的引入方式
  8. 拼多多面试真题:如何用 Redis 统计独立用户访问量!
  9. Intellij idea利用Statistic插件统计项目代码行数
  10. SpatiaLite, load spatial extension first