C++请不要问我string s=”a”+”b”分配了几次内存
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=的源码大致如下:
{ ... 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次内存。
转自:http://www.cnblogs.com/hlxs/archive/2011/08/08/2131147.html
转载于:https://www.cnblogs.com/this-543273659/archive/2011/08/08/2131321.html
C++请不要问我string s=”a”+”b”分配了几次内存相关推荐
- 请别再拿“String s = new String(xyz);创建了多少个String实例”来面试了吧---转
http://www.iteye.com/topic/774673 羞愧呀,不知道多少人干过,我也干过,面壁去! 这帖是用来回复高级语言虚拟机圈子里的一个问题,一道Java笔试题的. 本来因为见得太 ...
- 干趴面试官系列 | 请你简述一下Kafka中的分区分配
欢迎跳转到本文的原文链接:https://honeypps.com/mq/kafka-basic-knowledge-of-partition-assignors/ "请你简述一下Kafka ...
- 简述ip地址的abc类如何划分_面试官问:讲讲IP地址的分配原理
网络模型介绍 在计算机网络中有著名的OSI七层协议体系结构,概念清楚,理论完整,但是它既复杂又不实用.TCP/IP体系结构则不同,得到了广泛的应用.最终结合OSI和TCP/IP的优点,采用了一种只有五 ...
- string replace_面试必问:String类型为什么设计成不可变的?
这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下. 想要完全了解String,在这里我们需要解决以下 ...
- 程序员请不要问“在吗?”
我相信大家肯定都遇到过以下两个场景? 场景一: 做为一个北上广深飘,在距你千里之外的家乡肯定有很多的同学和朋友,但是由于常年漂泊在外,基本上很少联系?突然有一天,几年都没有联系你的大学同学/同事,大晚 ...
- b树删除节点每次只能删一个吗_面试官,请不要问我B+树了!!
每当我们执行某个 SQL 发现很慢时,都会下意识地反应是否加了索引,那么大家是否有想过加了索引为啥会使数据查找更快呢,索引的底层一般又是用什么结构存储的呢,相信大家看了标题已经有答案了,没错!B+树! ...
- java的map 使用string数组多了双引号_奥奥奥利给!!!再也不怕面试官问我String源码了!来吧...
简述 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了String 类来创建和操作字符串.字符串缓冲区支持可变字符串.因为String对象是不可变的,因此可以共享 ...
- redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式.高并发已经是业务要求的常态.像腾讯系的不少服务,还有CDN优化.异地多备份等处理. 说到分布式, ...
- soapUI(groovy脚本作用1)请不要问为什么系列1
SoapUI在测试WebService消息时,在构造用例过程中部分请求参数可能需要通过查询数据库或者通过随机数获取,此时可以借助Groovy脚本完成此功能,具体步骤如下: (1)从TestCase中获 ...
- soapUI(groovy脚本作用2)请不要问为什么系列2
在构造用例过程中可能需要对返回结果进行校验,此时可以借助Groovy脚本完成此功能,具体步骤如下: (1)通过SoapUI提供的GroovyUtils获取返回的xml消息的操作XmlHolder de ...
最新文章
- android 退出程序提示是否退出对话框
- 5分钟学习基于Go,go-microservice-template,Minke的微服务
- 11、MySQL字符集和校对规则详解
- YTU 2586: 填空题B-字画鉴别
- 文档扫描:深度神经网络在移动端的实践
- java抽象类与接口区别6_java基础知识(6)---抽象类与接口
- android颜色值的表示方法android:background=#FFFFFFFF的意思
- Zabbix 添加WEB监控(学习笔记十一)
- linux打包java jar_在linux环境下修改可运行jar包配置并重新打包
- 转:Real6410 Linux 常见问题总结(截至2010/07/26)
- .NET深入学习笔记(2):C#中判断空字符串的4种方法性能比较与分析
- Tomcat7基于Redis的Session共享
- 全网首发:(解决办法)MAC OS Xcode给应用设置沙箱(Enable App Sandbox)之后,运行报错Illegal instruction: 4
- Oracle数据库学习笔记(十五)--自连接
- Python爬虫基本代码附解析
- 09年杀毒软件大比拼
- eNSP华为基本配置命令
- 考虫四级词汇思维导图
- 数据库系统期末总结(三)(往届试卷2018年12月A卷、B卷、E卷,2019年5月A卷,选择题终篇)
- 来自Bitly的USA.gov数据,数据分析案例