メモリ配置が連続でない場合,メモリアクセスの不連続が生じてしまいます.
algorithm
ヘッダに含まれるstd::sort
を使用した場合,どのような挙動をするのか,少し疑問に感じたため調査しました.
目次
調査内容
まず,次のような動的配列を用意します.
std::vector vec = {1, 5, 9, 7, 3};
ソート前のメモリ配置
この場合のメモリ配列(アドレス)を次のように確認します.
for (std::size_t i = 0; i < vec.size(); ++i)
{
std::cout << vec[i] << ", " << &vec[i] << std::endl;
}
./a.out
1, 0x562924befeb0
5, 0x562924befeb4
9, 0x562924befeb8
7, 0x562924befebc
3, 0x562924befec0
ソート後のメモリ配置
std::sort
後に,メモリ配置を確認します.
std::sort(vec.begin(), vec.end());
for (std::size_t i = 0; i < vec.size(); ++i)
{
std::cout << vec[i] << ", " << &vec[i] << std::endl;
}
./a.out
1, 0x562924befeb0
3, 0x562924befeb4
5, 0x562924befeb8
7, 0x562924befebc
9, 0x562924befec0
結果としては,値はソートされておりメモリ配置はそのまま変更されずという結果になっています.
結果
そもそもイテレータやインデックスアクセスが可能となっているので,当たり前かもしれませんがメモリ配置が連続していました.
コンテナはブラックボックス化している一面もあるため,実際に調査してみることは重要かもしれません.
リンク