神秘的功能出现在我的gcov报告中

时间:2014-01-20 03:29:54

标签: c++ debugging profiling code-analysis gcov

我的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

修改

2 个答案:

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