【C++】STLコンテナVectorをソートした場合のメモリアライメントに関して調査した

メモリ配置が連続でない場合,メモリアクセスの不連続が生じてしまいます.

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

結果としては,値はソートされておりメモリ配置はそのまま変更されずという結果になっています.

結果

そもそもイテレータやインデックスアクセスが可能となっているので,当たり前かもしれませんがメモリ配置が連続していました.

コンテナはブラックボックス化している一面もあるため,実際に調査してみることは重要かもしれません.

>> アルゴリズムイントロダクション

よかったらシェアしてね!
目次