C++用new与不用new创建对象的区别

本文探讨了C++中创建对象时使用`new`关键字与不使用`new`的区别,涉及内存对齐问题、虚函数的影响以及不同区域的内存分配。在讨论中提到了对齐规则,例如当一个类包含一个字符和一个长整型变量时,其大小会因对齐而变为8字节。此外,还分析了静态存储、栈上和堆上创建对象的特性与优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值