C++之对象内存分配

C++之对象内存分配

在c++中类在实例化一个对象时,只为对象分配了存放成员变量的空间,如果类中存在虚函数那么还会分配一个指针大小的空间去存放指向虚表指针

现在让我们来看看在c++中编译器是怎样为对象分配空间的

其实和为结构体分配空间是一样的,分配一块能容纳所有成员的空间,成员按类中声明出现的先后顺序以次排列放在空间中

 

查看其反汇编代码

 

会看到编译器在栈上为其分12个字节的空间(字节对齐),

配查看构造函数的反汇编代码

会发现指令把0放入了[this]单元,把1放入[this+4]单元,把5放入[this+8]单元,我们再回头看下c++代码对照下我们就可以发现成员变量是按在类中声明的顺序依次存放在对象空间的

 

下面让我们看下类中有虚函数时对象的空间分配是怎样的

 

查看反汇编代码

 

发现比没有虚函数的对象多了4个字节的空间,多出的这4个字是干啥的?

查看构造函数的反汇编代码

 

发现[this]单元存放的是一个指向vtabl(virtual table)的地址,多出的这4个字节就是存放指向虚函数表的指针,vptr是存放在对象的最前面的,,,,,,,

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C++中,可以使用new来动态地在堆内存分配对象。例如,用 new ClassName()语法实现从堆内存分配ClassName对象,并将此对象的地址存储在ClassName *类型指针中。\[2\]这种方式可以在程序运行时动态地分配内存,而不是在编译时就确定内存大小。这对于需要根据运行时条件来确定内存大小的情况非常有用。 另外,在C++中,std::string类也会动态地分配内存来存储字符串数据。当我们给std::string赋值一个较长的字符串时,如果当前分配内存空间不足以容纳新的字符串,std::string会动态地分配更多的内存来存储新的字符串,并将原先的内容拷贝到新的内存空间中。\[3\]这样可以确保std::string能够容纳任意长度的字符串,但也会带来一定的性能开销。 总结起来,C++中的动态内存分配可以通过new关键字来实现对象的动态分配,而std::string类则会在需要时动态地分配内存来存储字符串数据。这样可以灵活地管理内存,并确保能够容纳任意长度的字符串。 #### 引用[.reference_title] - *1* *3* [C++ string介绍和坑](https://blog.csdn.net/weixin_43679037/article/details/127536657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C++中动态内存分配new](https://blog.csdn.net/qq_40965507/article/details/119383348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值