私がのstd ::リストコンテナを使用してメモリの解放をテストするために、次のコードを持っている:このコードを実行するなぜコンパイラはstd :: listの割り当てを延期していますか?
#include <iostream>
#include <list>
#include <string>
#include <boost/bind.hpp>
/* count of element to put into container
*/
static const unsigned long SIZE = 50000000;
/* element use for test
*/
class Element
{
public:
Element()
: mId(0)
{}
Element(long id)
: mId(id)
{}
virtual ~Element()
{
}
inline long getId() const
{
return this->mId;
}
inline bool operator<(const Element & rightOperand) const
{
return this->mId < rightOperand.mId;
}
inline bool isEven() const
{
return 0 == (this->mId & 1);
}
private:
long mId;
};
typedef std::list<Element> Elements;
int main(int argc, char * argv[])
{
std::string dummy;
{
Elements elements;
std::cout << "Inserting "<< SIZE << " elements in container" << std::endl;
std::cout << "Please wait..." << std::endl;
/* inserting elements
*/
for(long i=0; i<SIZE; ++i)
{
elements.push_back(i);
}
std::cout << "Size is " << elements.size() << std::endl;
std::getline(std::cin, dummy); // waiting user press enter
/* remove even elements
*/
elements.remove_if(boost::bind(& Element::isEven, _1));
std::cout << "Size is " << elements.size() << std::endl;
std::getline(std::cin, dummy);
}
std::getline(std::cin, dummy);
return 0;
}
は私に次のメモリプロファイル与える:
をgccがあるように見えます割り当て解除を延期し、私のテストプログラムでは、コマンドラインに戻る前に選択肢がなく、メモリを解放します。
解除がこんなに遅く起きるのはなぜ?
私は別の容器とシュリンクツーフィットトリックの作品をテストし、私はそれを期待していたときに解放されたメモリを解放するためのベクターで試してみました。
のgcc 4.5.0、Linuxの2.6.34
どのようにメモリ消費量を測定していますか? – NPE