假设我们有以下情况:
它可以写成:
std::string mode; //this cost us calling the constructor of std::string
if(time==Morning){ // a real code should be here
mood="Good"//re assign the string
}
else{
mood="bad"//re assign the string
}
std::cout << mood;
假设它不是std :: string,它是一个非常大的对象。声明“模式”并毫无理由地调用构造函数是不是太奢侈了! 使用原始指针是一个解决方案吗?这里最好的做法是什么? 谢谢
答案 0 :(得分:5)
您可以使用ternary operator初始化字符串。
std::string mode = (time == Morning ? "Good" : "Bad")
正如MSalters在注释中指出的,这实际上仍然是两个构造(构造函数+复制),但它应该由编译器优化。您可以使用
直接初始化字符串std::string mode { (time == Morning ? "Good" : "Bad") };
答案 1 :(得分:2)
我会考虑将逻辑放入一个单独的函数中。这有助于保持功能小而简单。
std::string moodAtTime(Time time)
{
if(time==Morning)
{ // a real code should be here
return "Good";
}
else
{
return "bad";
}
}
std::string mood = moodAtTime(t);
这减少了函数长度,并将代码拆分为执行简单问题的小单元。
如果仅用于初始化,则可以使用lambda来执行它而不使用命名函数:
std::string mood = [](Time t)
{
if(t==Morning)
{
return "Good";
}
else
{
return "bad";
}
}(now);
答案 2 :(得分:-1)
如果你经常输入那个特定的范围,成本会很高,是的,它会变得非常昂贵(取决于范围内发生的事情)。
解决方案是保持全局变量或更广泛使用的这类对象池(对象池/内存广泛用于此类目的,尤其是在小型和非常小的对象的情况下)。
所以,在代码中解释
{
static std::string g_uniqueNamed_temp_string;
...
// magic happens
...
}
快速解决方案
{
std::string* tempString = StringPool::GetAPreallocatedString();
...
// magic happens
...
}
优雅的解决方案
编辑:切换到原始指针以避免复制
{{1}}
答案 3 :(得分:-3)
您可以使用alloca
:
#include <iostream>
#include <sstream>
using namespace std::literals;
int main() {
void *mem = alloca(sizeof(std::string)); //Allocates memory on stack; no initialization
std::string *mood;
if(true){ // a real code should be here
mood = new (mem) std::string("Good");//re assign the string
}
else{
mood=new (mem) std::string("Bad");//re assign the string
}
std::cout << *mood;
return 0;
}