2016-04-12 10 views
1

プロジェクトを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ベクトルを変更せずに、遅い破壊問題を修正する方法はありますか?

答えて

1

あなたの理論は正しいように見えますが、最近特殊化が取り除かれ、バグのように見えます。チームの開発者は、呼び出される必要のないコンストラクタがいくつか存在していたため、変更が行われたとしています。この新しいバージョンは技術的にはおそらく正しいですが、デバッグには致命的な影響があります。

は私もこの問題を打ってるhttps://connect.microsoft.com/VisualStudio/feedback/details/2661660/missing-vector-specialization-for-scalar-types

を参照してください。ここに私のテストプログラムがあります:それはツールセット= vc140/wの〜11,000msをとりながら

int main() 
{ 
    auto foo = new std::vector<unsigned char>(100 * 1000 * 1000); 
    delete foo; 
    return 0; 
} 

これは、ツールセット= VC120/W VS 2015で54ms〜で実行されます。すべての時間が削除行に費やされます。

解決策がまだ見つかりませんでした。

+1

素晴らしい、ありがとう!私は彼らが本当に次のアップデートでこれを修正することを願っています。私の必要性(Cの相互作用のためのバッファを作成するため)では、 'unique_ptr 'を使用して切り替えて、この簡単な作業でうまく動作します。 – Steed

+1

VS 2015アップデート3で修正されているようです。リリースノートから: _更新2で回帰した簡単なオブジェクトの範囲を破棄すると、デバッグモードのパフォーマンスが復元されました。たとえば、vector._ –

+1

アップデート3で –

関連する問題