C++用new与不用new创建对象的区别
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。
C++用new与不用new创建对象的区别的更多相关文章
- C++用new创建对象和不用new创建对象的区别解析
在C++用new创建对象和不用new创建对象是有区别的,不知你是否清楚的了解它们到底有什么样的区别呢?下面小编就用示例来告诉大家吧,需要的朋友可以过来参考下 我们都知道C++中有三种创建对象的方法 ...
- JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)
// 对象:特指的某个事物,具有属性和方法(一组无序的属性的集合) // 特征------>属性 // 行为------>方法 // 创建对象的四种方式 1 // 1.字面量的方式,就是实 ...
- JS中用new创建对象与不用new创建对象区别:
function classA() { console.log(this); var that = this == window ? {} : this; that.name = "clas ...
- Object.create(null)、Object.create({})、{} 三者创建对象的区别
参考 1.先看看我们经常使用的{}创建的对象是什么样子的: var o = {a:1}; console.log(o) 从上图可以看到,新创建的对象继承了Object自身的方法,如hasOwnProp ...
- C++用new来创建对象和非new来创建对象的区别
转:http://www.cnblogs.com/GODYCA/archive/2013/01/10/2854777.html 我们都知道C++中有三种创建对象的方法,如下: #include < ...
- 关于new与=号创建对象的区别
(1)先定义一个名为str的对String类的对象引用变量:String str: (2)[在[栈]中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为" ...
- object.create(null) 和 {}创建对象的区别
原文 简书原文:https://www.jianshu.com/p/43ce4d7d6151 创建对象的方法 如果要创建一个空的对象,可以使用如下的三种方法 var obj1 = {}; var ob ...
- JS高级---工厂模式创建对象和自定义构造函数创建对象的区别
创建对象:工厂模式和自定义构造函数的区别 共同点: 都是函数, 都可以创建对象, 都可以传入参数 区别: 工厂模式: 函数名是小写 有new, 有返回值 new之后的对象是当前的对象 直接调用 ...
- Java中堆和栈创建对象的区别
http://blog.csdn.net/hbhhww/article/details/8152838
随机推荐
- Load Testing Socket.IO Web Applications and Infrastructure
转自:https://medium.com/better-programming/load-testing-socket-io-web-applications-and-infrastructure- ...
- ps制作马赛克图片
- SpringBoot 的一些学习资源
很多Java Web开发者目前常用的技术还是SpringBoot,想要工作效率更,在刚入门不久时有必要全面了解一下它的功能特性,而高效学习的方法,除了在官网学习外,还可以看下网上已有的不错的教程.刚看 ...
- 小胖守皇宫(VIJOS P1144 )题解
题目描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每 ...
- 【JZOJ5553】【20190625】谜
题目 给出一个\(2\times n\)个点的二分图的邻接矩阵\(M\) 以及\(m\)个行替换元,\(k\)个列替换元 \(q\)次询问:op u v 表示用第v个行/列替换元去替换矩阵的第u行/列 ...
- JavaScript var、let、const
var申明的变量是有作用域的 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量: 'use strict'; function foo() { var x = 1; ...
- webpack4.0中文文档踩坑记录
一直没有正儿八经去看过webpack4.0的文档,前段时间工作比较轻松,于是就有了此文...面都这样一个问题:请问在您的开发生涯中,令你最痛苦最无奈的是什么?小生的回答只有一个:“阅读那些令人发指的文 ...
- 线程池ScheduledThreadPoolExecutor
Java中调度线程池ScheduledThreadPoolExecutor原理探究 一. 前言 前面讲解过Java中线程池ThreadPoolExecutor原理探究,ThreadPoolExecut ...
- DB2数据库基础
一.DB2数据库安装教程 DB2安装教程:https://jingyan.baidu.com/article/e75057f2f59ef9ebc91a8905.html 二.DB2常用命令 1. 打开 ...
- vue项目 既能通过ip访问项目,又可以本地localhost访问
1.场景问题: 有时候开发过程中,vue项目需要其他同事能访问你本地进行调试,而不是需要重新拉取代码来启动很麻烦 2.解决思路: 一. package.json"dev": &qu ...