C ( memmove
cstring ライブラリ) では、ハンドルが適切にオーバーラップすることを理解しています。なぜこの追加のランタイム コストがかかるのだろうと思っていました。オーバーラップの問題は、前方ではなく後方にコピーすることで修正できるように思えますが、間違っていますか?
おもちゃの例として、配列の内容を右に 1 要素だけシフトする「右シフト」関数の 2 つのバージョンを次に示します。
// Using memmove
template <typename T>
void shift_right( T *data, unsigned n )
{
if (n)
{
data[n-1].~T();
memmove( data+1, data, (n-1)*sizeof(T) );
new (data) T();
}
}
// Using copy_backward
template <typename Iterator>
void shift_right( Iterator first, Iterator last )
{
Iterator it = last;
std::copy_backward( first, --it, last );
}
それらは同等ですか?パフォーマンス的には、どちらを使用するのが最適ですか?
注: @DieterLücking のコメントから判断すると、予防措置が取られているにもかかわらず、上記のバージョンを使用することmemmove
は、この状況では安全ではありません。