在std头文件中的容器析构函数中添加统计代码。这不需要修改大量的项目代码。但是这只显示容器类型(请参见我在此处的另一个回答)。该方法不需要C++0x或C++11或任何更高版本。
第一步和强制性步骤是将您的std库添加到源代码控制中,例如git,以便快速查看实际更改并快速在修改版和原始版本之间切换。
将
Stat
类的声明放置在std库源文件夹中:
class Stat {
std::map<std::string,int> total;
std::map<std::string,int> maximum;
public:
template<class T>
int log( std::string cont, size_t size ) {
std::string key = cont + ": " + typeid(T).name();
if( maximum[key] < size ) maximum[key] = size;
total[key] += size;
}
void show_result() {
std::cout << "container type total maximum" << std::endl;
std::map<std::string,int>::const_iterator it;
for( it = total.begin(); it != total.end(); ++it ) {
std::cout << it->first << " " << it->second
<< " " << maximum[it->first] << std::endl;
}
}
static Stat& instance();
~Stat(){ show_result(); }
};
在您的项目cpp文件中实例化Stat
类的单例:
Stat& Stat::instance() {
static Stat stat;
return stat;
}
编辑标准库容器模板。在析构函数中添加统计记录。
template< T, Allocator = std::allocator<T> > vector {
...
virtual ~vector() {
Stat::instance().log<value_type>( "std::vector", this->size() );
}
};
template< Key, T, Compare = std::less<Key>,
Allocator = std::allocator<std::pair<const Key, T> > map {
...
virtual ~map(){
Stat::instance().log<value_type>( "std::map", this->size() );
}
};
考虑一个编程示例程序:
Consider a program for example now:
int main() {
{
std_vector<int> v1; for(int i=0;i<10;++i) v1.push_back( i );
std_vector<int> v2; for(int i=0;i<10;++i) v2.push_back( i );
std_map<int,std::string> m1; for(int i=0;i<10;++i) m1[i]="";
std_map<int,std::string> m2; for(int i=0;i<20;++i) m2[i]="";
}
Stat::instance().show_result();
return 0;
}
gcc的结果如下:
container type total maximum
std::map: St4pairIiSsE 30 20
std::vector: i 20 10
如果您需要更详细的类型描述信息,则可以查找与您的开发环境相关的信息。此处描述了gcc的转换:
https://lists.gnu.org/archive/html/help-gplusplus/2009-02/msg00006.html
输出可能如下所示:
container type total maximum
std::map: std::pair<int, std::string> 30 20
std::vector: int 20 10