(2018/03/21)std::vectorは可変の配列を自動で取得してくれる便利な仕組みではあるが、その末尾への追加にあたるpush_backはとても重い。どのくらい重いかというと、決め打ちの配列に格納する場合はCPU負荷が高くても全体で0.1%いくかな程度の処理に対し、配列をvectorで。追加をpush_backで行うと、reserveであらかじめ必要数を確保していても、CPU負荷は余裕で100%を越えて計測不可能となった。マルチスレッドで読み込みしてる間に別スレッドでpush_backしたらクラッシュする事から考えると、もしかしてvectorは余剰の要素数を確保していても一個要素を挿入するために毎回全面的になにかをやり直してるという事なのか...少なくともイテレーターやat参照先は全部総入れ替えになるんだろう。参照エラーでクラッシュするもんね。排他処理で重いのかとも疑ったが、そちらはとくに原因ではなかった。負荷100%はどうしようもないので、速度と負荷を少しでも気にする場所にstd::vectorのpush_backやらinsertを入れるのは考えなおすことにした。親戚のstd::stringも便利だが、これからは処理が重かったら真っ先に疑いそうだ。それくらいのショック度。挿入という方法をとって、一切push_backを使わなくても負荷100%に振り切れるのはなくならなかった。配列の構造体の中にstd::stringを入れているのとかが原因なのかとおもったが、無くしても解決しなかった。結局のところどういうことなのかというと、vectorクラスの中に可変の(サイズが変わらなくてもメモリを取得するもの)要素があると、変更のたびに、親のvectorの全てのデータの再メモリ取得、コピーが行われる(?)みたいなので、変更を殆どしないものでないかぎりvectorではなく自前でメモリ確保したほうが100倍まし。してもvectorでなきゃいやという場合は、あらかじめreserve関数で必要数を確保する以外に軽減方法が見当たらず、軽さと早さがほしいなら自前で作れというのはC言語の掟かなにかなのだろうか。想像するにC#とかはこのあたりのラッパーかもしれないから、C#で速さを求める可変要素を作るのは無理ということだろうか。したら暗い未来だなぁ。Defender誤検出の原因コード。