c++ inline 优化机理求剖析!!
首先有一个结构体
[解决办法]
关于返回值, 有时候需要时T&(比如operator=), 其他时候用T就好(编译器有RVO/NRVO)
operator= 返回 string& 的话,我用 string 接收,会产生一次构造啊!
string t_oStrRecv = string("123");
这里应该会调用两次构造吧?
另外,string getString(String str) {
StringStream t_oStrStream;
t_oStrStream << str << "-hahaha";
return t_oStrStream.str();
}
...
const string& t_oStrRecv = getString("hehe");
用 const string& 接收 getString() 的返回值,可取么?是否也是不安全的做法,因为很可能返回值很快就被释放?
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <tchar.h>
#include <string>
using namespace std;
struct MyStruct
{
MyStruct()
{
cout << "发生了构造" << endl;
};
MyStruct(const MyStruct &)
{
cout << "发生了拷贝" << endl;
}
MyStruct(const MyStruct &&)
{
cout << "发生了拷贝转移" << endl;
}
MyStruct operator = (const MyStruct &)
{
cout << "发生了赋值" << endl;
return MyStruct();
}
MyStruct operator = (const MyStruct &&)
{
cout << "发生了赋值转移" << endl;
return MyStruct();
}
void dosomething() const
{
cout << "Address:" << (int)this << endl;
}
};
MyStruct test1()
{
return MyStruct();
}
MyStruct test2()
{
MyStruct tmp;
tmp.dosomething();
return tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
const MyStruct & tmp = test2();
tmp.dosomething();
cout << "------分隔符------" << endl;
const MyStruct tmp2 = test2();
tmp2.dosomething();
system("pause");
return 0;
}
很多问题基础概念和原理搞清楚,问题就不存在了。不要本末倒置。
这是我实际遇到过的一个问题,环境是这样的string num2str(int in_iNum) {
string t_oStrRetVal;
stringstream t_oStrStream;
t_oStrStream << in_iNum;
t_oStrStream >> t_oStrRetVal;
return t_oStrRetVal;
}
void MyClass::test() {
if (...) {
...
} else {
const char* tmp_pArrCharCount = num2str(100).c_str();
printf("%s", tmp_pArrCharCount);
...
}
}
结果 printf 打印出了其他的一些字符串
但是如果改写为void MyClass::test() {
if (...) {
...
} else {
string tmp_oStrCount = num2str(100).c_str();
printf("%s", tmp_oStrCount.c_str());
...
}
}
则能够打印出正确的东西来,能帮我分析一下为什么么?
对于入参,一般最好用const 的引用:我所在的项目组,因为工程大,link时间过长,曾经花专人,用了好几个星期去优化项目,其中一个大头就是inline。
其中一个大头就是 inline,怎么去优化这个东西呢?用宏?