避免在给定示例上重新分配内存

Avoid memory reallocation on given example

该函数被调用得非常频繁,所以我尝试降低内存重新分配等。令我困扰的是 vectorint,尽管我不能将它们移到函数之外,否则我得到 std::bad_alloc。到目前为止我有:

void callbString(const std_msgs::String::ConstPtr& msg)
{
    vector<string> cbstrVec;
    int cbtype;

    //get string and split into vector
    string str = (msg->data.c_str());
    if(str.empty()) return;
    str.erase(0,1);
    boost::split(cbstrVec, str, boost::is_any_of(" "));
    stringstream(cbstrVec[2])>>cbtype;
    c.setvec(cbstrVec,cbtype); //takes (vector<string>,int) 
}

您是否对应用程序进行了概要分析?并且您的代码真的是瓶颈吗? 如果您有... 那么

好吧,如果你使用的是 C++11 编译器,你可以这样做,如果你没有 C++11 编译器,请删除 thread_local,但你将不得不采取如果有机会在多线程代码中调用该例程,请注意 reentrancy

void callbString(const std_msgs::String::ConstPtr& msg)
{
    static thread_local vector<string> cbstrVec;
    static thread_local std::string str;

    int cbtype;  //int is super cheap

    cbstrVec.clear();

    //get string and split into vector
    str = (msg->data.c_str());
    if(str.empty()) return;
    str.erase(0,1);
    boost::split(cbstrVec, str, boost::is_any_of(" "));
    stringstream(cbstrVec[2])>>cbtype;
    //c.setvec(cbstrVec,cbtype); //takes (vector<string>,int) 
    c.setvec(std::move(cbstrVec),cbtype); //takes (vector<string>,int) 
}

cbstrVecstr 将重用它们的内存,因为 cbstrVec.clear() 并没有真正释放向量分配的所有内存,重新分配 str 将重用内部存储在良好的 STL 实现中