作者回复: 把C++当作一种工具,也当作一种锻炼思维的方式,不要把它当成非用不可的圣器。把自己定位成“程序员”,而不是“C++程序员”。职业的将来方向定位成“软件架构师”、“开发主管”、“CTO”之类的角色,而不是“高级C++程序员”。
该用其他语言的时候用其他语言。要看到,即使不用C++,C++程序员在对优化的理解、对内存管理的理解等方面都是具有很大优势的。
作者回复: 是。👍
作者回复: 理解满分。👍
作者回复: 1. “通常”。字符串字面量是个继承自C的特殊情况。
2. 这个搜索一下就行。这是CPU的缓存结构决定的。
3. 其他类,尤其容器类,会期待移动构造函数无异常,甚至会在它有异常时选择拷贝构造函数,以保证强异常安全性。
作者回复: 再多说一句,如果每个人都这么让我来看笔记的话,我是不可能满足所有人的。只看你的,也对别人不公。在这儿回答(不重复的)问题则不同,问题一般是有共性的,回答之后,大家都能看到,都能从中受益。
作者回复: 对,最主要就是这点,用完美转发来正确调用构造函数。
作者回复: 你在学校的时候,都是让老师来看你的笔记记得好不好的吗?😂
对不起,如果有明确的问题,我可以回答。否则,我只能暂时忽略了。
作者回复: 对,x = 1 和 ++x 返回的都是对 x 的 int&。x++ 则返回的是 int。
作者回复: 中间传的都是引用,没有拷贝或移动发生的。只有用Obj(而不是Obj&或Obj&&)作为参数类型才会发生拷贝或移动构造。
作者回复: 文中已经说了,禁止返回本地对象的引用。
需要生成一个 Obj,给了一个 Obj&&,不就是调用构造函数而已么。所以(看文中输出),就是多产生了一次Obj(Obj&&) 的调用。
作者回复: 因为移动发挥威力了……试试把 std::string("hello") 放到 test2 开头作为变量,然后后面使用这个变量。
作者回复: 2完全正确。1再想想。🤓
作者回复: process_shape 返回的是对象,不是引用。结果不管有没有返回值优化(实际是有的),都是在调用者的栈上。没有生命期延长的话,执行完 process_shape 这一句,对象就销毁了。有生命期延长,则要到 r 的生命期结束时才销毁。
作者回复: xvalue 是有标识符的。这儿临时对象一直没有标识符,也就一直是 prvalue。
作者回复: 我觉得我做不到比文中更清楚了(否则我就写进去了)。😅
多看例子来体会一下吧……
作者回复: 内存复制,memcpy、strcpy 这样的操作。
作者回复: 迷糊是正常的……我也啃了几遍才基本搞通。多看几遍吧。
1. 是。
2. 是。
3. 超出作用域就没了。在你的这个例子里,它的生命期跟对象的生命期没有关系。
4. 错误解引用是因为引用超出了变量的生命期。如果没有生命期延长,一个临时对象在当前语句执行结束即被销毁。你写的不会有问题,但把value替换成get_value()一般就会了。
作者回复: https://github.com/adah1972/
作者回复: 返回值优化在没有开启优化编译选项时也是可能发生的。编译器看到这种形式的代码直接统一处理了。