避免在给定示例上重新分配内存
Avoid memory reallocation on given example
该函数被调用得非常频繁,所以我尝试降低内存重新分配等。令我困扰的是 vector
和 int
,尽管我不能将它们移到函数之外,否则我得到 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)
}
cbstrVec
和 str
将重用它们的内存,因为 cbstrVec.clear()
并没有真正释放向量分配的所有内存,重新分配 str
将重用内部存储在良好的 STL 实现中
该函数被调用得非常频繁,所以我尝试降低内存重新分配等。令我困扰的是 vector
和 int
,尽管我不能将它们移到函数之外,否则我得到 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)
}
cbstrVec
和 str
将重用它们的内存,因为 cbstrVec.clear()
并没有真正释放向量分配的所有内存,重新分配 str
将重用内部存储在良好的 STL 实现中