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。

C++用new与不用new创建对象的区别的更多相关文章

  1. C++用new创建对象和不用new创建对象的区别解析

    在C++用new创建对象和不用new创建对象是有区别的,不知你是否清楚的了解它们到底有什么样的区别呢?下面小编就用示例来告诉大家吧,需要的朋友可以过来参考下   我们都知道C++中有三种创建对象的方法 ...

  2. JS创建对象的四种简单方式 (工厂模式和自定义构造函数创建对象的区别)

    // 对象:特指的某个事物,具有属性和方法(一组无序的属性的集合) // 特征------>属性 // 行为------>方法 // 创建对象的四种方式 1 // 1.字面量的方式,就是实 ...

  3. JS中用new创建对象与不用new创建对象区别:

    function classA() { console.log(this); var that = this == window ? {} : this; that.name = "clas ...

  4. Object.create(null)、Object.create({})、{} 三者创建对象的区别

    参考 1.先看看我们经常使用的{}创建的对象是什么样子的: var o = {a:1}; console.log(o) 从上图可以看到,新创建的对象继承了Object自身的方法,如hasOwnProp ...

  5. C++用new来创建对象和非new来创建对象的区别

    转:http://www.cnblogs.com/GODYCA/archive/2013/01/10/2854777.html 我们都知道C++中有三种创建对象的方法,如下: #include < ...

  6. 关于new与=号创建对象的区别

    (1)先定义一个名为str的对String类的对象引用变量:String str: (2)[在[栈]中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为" ...

  7. object.create(null) 和 {}创建对象的区别

    原文 简书原文:https://www.jianshu.com/p/43ce4d7d6151 创建对象的方法 如果要创建一个空的对象,可以使用如下的三种方法 var obj1 = {}; var ob ...

  8. JS高级---工厂模式创建对象和自定义构造函数创建对象的区别

    创建对象:工厂模式和自定义构造函数的区别 共同点: 都是函数, 都可以创建对象, 都可以传入参数   区别:   工厂模式: 函数名是小写 有new, 有返回值 new之后的对象是当前的对象 直接调用 ...

  9. Java中堆和栈创建对象的区别

    http://blog.csdn.net/hbhhww/article/details/8152838

随机推荐

  1. 压缩、解压命令——gzip、gunzip、tar、zip、bzip2

    1.gzip命令与gunzip命令(压缩解压文件): (1)gzip——压缩: 利用touch命令创建一个文件,并向里面写入内容: 对创建的文件进行压缩: (2)解压缩gzip -d或gunzip: ...

  2. [RN] React Native 实现 类似京东 的 沉浸式状态栏和搜索栏

    React Native 实现 类似京东 的 沉浸式状态栏和搜索栏 其原理其实就是在要 隐藏 部分的那个View 前面加入 StatusBar 代码! 代码如下: <StatusBar anim ...

  3. call JSON.parse JSON.stringify typeof 的使用及严格模式this的使用

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  4. fork和vfork

    转载 http://coolshell.cn/articles/12103.html 在知乎上,有个人问了这样的一个问题——为什么vfork的子进程里用return,整个程序会挂掉,而且exit()不 ...

  5. vsftp上传553 Could not create file错误解决

    可以正常连接,可是上传文件是提示553 Could not create file无法创建文件. 权限不足,从根目录开始检查保证每个文件夹都有777的权限,就可以正常上传.

  6. django 下载文件,指定文件中文名称

    Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件.Content-disposition其实可以控制用户请求所得的内容存为一个 ...

  7. planning algorithms chapter 3

    chapter 3 几何表示和变换 P.S: 总算到了 motion planning 部分了 几何建模 几何建模主要有两类方法:边界表示法和实体表示法. 环境模型可以是二维或三维,实体主要包括障碍物 ...

  8. vlc for mac设置中文的方法

    VLC for mac是一款mac系统下的多媒体播放器,支持播放MPEG-1.MPEG-2.MPEG-4.DivX.MP3和OGG,以及DVD.VCD.等各种流媒体协议在内的多种协议格式,并且能够对电 ...

  9. K8S集群搭建——基于CentOS 7系统

    环境准备集群数量此次使用3台CentOS 7系列机器,分别为7.3,7.4,7.5 节点名称 节点IPmaster 192.168.0.100node1 192.168.0.101node2 192. ...

  10. Asp.Net Core Cookie使用,Asp.net Core Cookie操作失效

    注:本文主要介绍Asp.net Core 3.0后增加cookie代理功能. 默认是增加了的. 默认增加的这个有些问题所在, 1.原来设置cookie方式将不可用,需要按照代理方式设置 2.对于ses ...