以下のカスタムアロケータでベクトルを使用したいのですが、その中にconstruct()
はdestroy()
空の本文があります。
struct MyAllocator : public std::allocator<char> {
typedef allocator<char> Alloc;
//void destroy(Alloc::pointer p) {} // pre-c+11
//void construct(Alloc::pointer p, Alloc::const_reference val) {} // pre-c++11
template< class U > void destroy(U* p) {}
template< class U, class... Args > void construct(U* p, Args&&... args) {}
template<typename U> struct rebind {typedef MyAllocator other;};
};
別の質問で指定した理由によりvector
、ループ内で数回サイズ変更する必要があります。パフォーマンスのテストを簡素化するために、次のような非常に単純なループを作成しました。
std::vector<char, MyAllocator> v;
v.reserve(1000000); // or more. Make sure there is always enough allocated memory
while (true) {
v.resize(1000000);
// sleep for 10 ms
v.clear(); // or v.resize(0);
};
construct()
アロケータに空のdestroy()
メンバー関数があるにもかかわらず、CPU消費量が30%から80%に増加するようにサイズを変更することに気づきました。そのため、パフォーマンスへの影響はごくわずかであるか、まったく影響がない(最適化が有効になっている)と予想していました。その消費の増加はどのように可能ですか?2番目の質問は、サイズ変更後にメモリを読み取るときに、サイズ変更されたメモリ内の各文字の値が0であることがわかる理由です(constuct()
何もしないため、ゼロ以外の値が予想されます)。
私の環境はg++4.7.0で、-O3レベルの最適化が有効になっています。PC Intelデュアルコア、4GBの空きメモリ。どうやらへの呼び出しconstruct
はまったく最適化できませんでしたか?