我的gcov报告中出现了一个神秘的函数Function '_ZNSsaSERKSs'
,我完全不知道它是什么,有人可以向我解释发生了什么
由于
标头文件
#ifndef CASHIER_H
#define CASHIER_H
#include <string>
using namespace std;
class cashier
{
public:
void setID(string);
string getID();
void setPassword(string);
string getPassword();
void settries(int);
int gettries();
void increase_tries();
private:
string ID;
string Password;
int tries;
};
#endif /* CASHIER_H */
实施文件
#include "cashier.h"
void cashier::setID(string value)
{
this->ID = value;
}
void cashier::setPassword(string value)
{
this->Password = value;
}
string cashier::getID()
{
return this->ID;
}
string cashier::getPassword()
{
return this->Password;
}
void cashier::settries(int value)
{
this->tries=value;
}
int cashier::gettries()
{
return this->tries;
}
void cashier::increase_tries()
{
this->tries = this->tries + 1 ;
}
我输入以下命令
gcov -f cashier.gnco
我得到了以下结果B
Function '_ZN7cashier8settriesEi'
Lines executed:100.00% of 3
Function '_ZN7cashier8gettriesEv'
Lines executed:100.00% of 2
Function '_ZN7cashier14increase_triesEv'
Lines executed:100.00% of 3
Function '_ZN7cashier11getPasswordEv'
Lines executed:100.00% of 2
Function '_ZN7cashier5getIDEv'
Lines executed:100.00% of 2
Function '_ZNSsaSERKSs' //mysterious function
Lines executed:0.00% of 2
Function '_ZN7cashier11setPasswordESs'
Lines executed:100.00% of 3
Function '_ZN7cashier5setIDESs'
Lines executed:100.00% of 3
File 'cashier.cpp'
Lines executed:100.00% of 18
cashier.cpp:creating 'cashier.cpp.gcov'
File '/usr/include/c++/4.4/bits/basic_string.h'
Lines executed:0.00% of 2
/usr/include/c++/4.4/bits/basic_string.h:creating 'basic_string.h.gcov'
File '/usr/include/c++/4.4/bits/basic_string.h'
Lines executed:0.00% of 2
No branches
Calls executed:0.00% of 1
/usr/include/c++/4.4/bits/basic_string.h:creating 'basic_string.h.gcov
修改
答案 0 :(得分:3)
使用c++filt
来解析名称
std::string::operator=(std::string const&)
std::string
的复制赋值运算符。
答案 1 :(得分:1)
正如其他人所描述的那样,您需要使用c++filt
将名称从“受损”形式转换为人类可读的形式。 c++filt
采用标准输入,检测损坏的C ++字符串并写入输出并更正名称;所以,例如gcov -f filename | c++filt
您的问题的根源是在头文件中按值std::string
并将函数体放入实现中,这可以防止编译器进行巧妙的优化并强制它构造临时的std :: strings。 / p>
void setID(string);
void setPassword(string);
这些函数非常简单,您应该将它们的实现放在头文件中,以便编译器可以根据需要内联它们。但最终,您需要做的是接受参考。
void setID(const std::string& id)
{
this->m_id = id;
}
void setPassword(const std::string& password)
{
m_password = password;
}
(成员变量的'm_'前缀是用于区分成员名称和变量名称的更广泛使用的方法之一。)
这使编译器无需创建中间临时文件并从源文件串中复制文本。如果您的性能仍然存在问题,您可能需要查看C ++ 11s rvalues:
void setPassword(std::string&& password);