博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++请不要问我string s=”a”+”b”分配了几次内存
阅读量:4692 次
发布时间:2019-06-09

本文共 1459 字,大约阅读时间需要 4 分钟。

                                                                                                                                                                                                                                                                          C++请不要问我string s=”a”+”b”分配了几次内存

       首先我要告诉你,string s="a"+"b";在C++中连编译都通过不了,错误提示:“+:不能添加两个指针”。你说他分配几次内存。为什么报错呢,原因很简单,”a”是一个字符数组,字符数组没有自己的加法运算符。你硬是要这么写,自己实现去,当然在java,js,C#(我还是个C#程序员啊,什么时候才能成为C++程序员呢?哥带着这个难题一直在学习C++)中这句话是正确的。那是因为这些语言把一些基础的东西都封装了,或者说这些语言实现了字符数组的加法运算符。   当我们把这句话改成string a=”a”;string s=a+”b”;就没有问题了。现在a是一个字符串,有现成的加法运算符,加法运算符的右边参数应该为字符串,字符数组,字符,指向字符串的指针等,右边参数为int,bool型的没有重载。   那么这两句话到底分配了几次内存呢,有人说2次,有人说3次。我说4次。   有人说编译器优化,只需要1次,编译器优化我真的管不了。   说2次的人可能认为:“a”一次,”b”一次,共两次   说3次的人可能认为:“a”一次,”b”一次,”a”+”b”要分配一块新的内存。因为必须重新分配一块内存,来存储”ab”。如果是a+=b;就不用了,编译器会把a+b的值存在a所在的空间中,如果空间不够,应该会分配一块更大的内存来存储a+b的值(存不下,不给一块更大的空间,行吗?)。   以上三次是必须,第四次分配内存发生在将a+b的值赋给s,即s=”ab”。我是在反复看Effective C++时不经意间发现的。Effective C++中条款15: 让operator=返回*this的引用,解释得非常清楚。我在这里简要说一下。       string类的operator=的源码大致如下:

 string& string::operator=(const string& rhs)
 {   ...   return *this;    // 返回左边的对象   }  因为赋值语句的右边参数不是正确的类型——它是一个字符数组”ab”,不是一个string——编译器就要产生一个临时的string对象使得函数继续运行。就是说,编译器必须产生大致像下面这样的代码:
  const string temp("ab");// 产生临时string,这句话不分配内存才怪,哈哈…  s = temp;           // 临时string传给operator=
如果string类的operator=的源码大致如下:(即参数中的const去掉)
  string& string::operator=( string& rhs)   {  ...  return *this;    // 返回当前的对象    }  那么string s=a+”b”;编译肯定是通过不了的。因为”b”是个常量字符串,把常量字符串赋给non-const字符串肯定是不行的。调用string& string::operator=方法时,参数为值传递或者是常量引用传递,都会产生临时变量,并用形参初始化临时变量,当然必须为这个临时变量分配内存,等函数调用完成,系统自动释放临时变量的内存,当然我们也知道这个临时变量的内存不是分配在堆中,而是分配在栈中。       是的,string s=”a”+”b”;就是分配了4次内存。
转自:    
 
 

转载于:https://www.cnblogs.com/this-543273659/archive/2011/08/08/2131321.html

你可能感兴趣的文章
jdbc、DBUtils
查看>>
一个关于vue+mysql+express的全栈项目(四)------ sequelize中部分解释
查看>>
数据库服务器监控取不到值
查看>>
Major Performance Impacts
查看>>
监督学习--k近邻算法
查看>>
Python 进程与线程
查看>>
【3-31】操作属性、元素、内容及定时器
查看>>
统计局的五级(省市区乡村)数据库支持 MS SQL SERVER 2005 和 MS SQL SERVER 2008
查看>>
软件测试
查看>>
[整理]在命令行执行 UIAutomation
查看>>
Overlapping Rectangles
查看>>
新浪IP库地址
查看>>
centos7 eclispe 编译C++遇到的问题总结
查看>>
1-ML的基本概念
查看>>
自动附加Sqlserver数据库
查看>>
02.设计模式
查看>>
LeetCode 371. Sum of Two Integers
查看>>
ZBrush功能特性之法线贴图
查看>>
virtualbox虚拟机ubuntu操作系统,设置网络互通、访问,能访问虚拟机swoole的http服务...
查看>>
磁盘inode节点被占满的解决方法
查看>>