プロジェクトをVisual Studio 2015にアップグレードしているうちに、画像を保存していた大きいvector<unsigned char>
の破棄に関する問題が発生しました。約5Mbです。デバッグビルドでは約0.5秒かかりましたが、char(POD
タイプ)の場合、これは原則として1つのメモリ解放呼び出しでなければなりません。スカラー型のベクトル特殊化はVisual C++ 2015ではなくなりましたか?
デバッガは、VS2015(VC 14.0)の実装が破壊された配列内の各要素を反復処理し、デストラクタを呼び出すことを示しています(POD
型でも複合型でも)。だから私は問題を理解し、それがなぜデバッグビルドでのみ発生しているのですか?リリースビルドでは、空の関数の不必要な呼び出しを取り除くのに十分なほど賢明です。
が実際のVisual Studioのすべての以前のバージョンではスカラ型のための専門があった(2003年と2012年にチェック):
template<class _Alloc> inline
void _Destroy_range(typename _Alloc::pointer _First,
typename _Alloc::pointer _Last, _Alloc& _Al,
_Scalar_ptr_iterator_tag)
{ // destroy [_First, _Last), scalar type (do nothing)
}
を今ではなくなって、私たちが持っているすべては
template<class _Alloc> inline
void _Destroy_range(typename _Alloc::pointer _First,
typename _Alloc::pointer _Last, _Alloc& _Al)
{ // destroy [_First, _Last)
for (; _First != _Last; ++_First)
_Al.destroy(_STD addressof(*_First));
}
Iでありますなぜこの便利で簡単な最適化が削除されたのか理解できません。 Microsoftからこれに関するコメントが見つかりませんでした。
質問:
- 誰がこの変更の理由を知っていますか?
- 私たちのコード(カスタムコンテナまたは
unique_ptr<type[]>
/boost::scoped_array
)の各PODベクトルを変更せずに、遅い破壊問題を修正する方法はありますか?
素晴らしい、ありがとう!私は彼らが本当に次のアップデートでこれを修正することを願っています。私の必要性(Cの相互作用のためのバッファを作成するため)では、 'unique_ptr'を使用して切り替えて、この簡単な作業でうまく動作します。 –
Steed
VS 2015アップデート3で修正されているようです。リリースノートから: _更新2で回帰した簡単なオブジェクトの範囲を破棄すると、デバッグモードのパフォーマンスが復元されました。たとえば、vector._ –
アップデート3で –