声明指针或堆栈变量

时间:2015-08-28 12:29:01

标签: c++ c++11

假设我们有以下情况:

  • 如果是早上心情好,否则情绪不好
  • 打印心情

它可以写成:

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,它是一个非常大的对象。声明“模式”并毫无理由地调用构造函数是不是太奢侈了! 使用原始指针是一个解决方案吗?这里最好的做法是什么? 谢谢

4 个答案:

答案 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;
}