constness はコンパイル時のチェックであるため、それらは同一である必要があります。
癖がないことを自分自身に証明するために、anon のコードを使用するように変更し、clock_gettime
キャッシング バイアスを回避するために外側のループを追加し、何度も実行しました。結果は驚くほど一貫性がありませんでした - 上下 20% (利用可能なアイドル ボックスはありません) - しかし、両方の最小時間iterator
とconst_iterator
実質的に同じでした。
次に、コンパイラ (GCC 4.5.2 -O3) を使用してアセンブリ出力を生成し、2 つのループを視覚的に比較しました:同一です(いくつかのレジスタ ロードの順序が逆になっていることを除いて)。
iterator
ループ
call clock_gettime
movl 56(%esp), %esi
movl $10, %ecx
movl 60(%esp), %edx
.p2align 4,,7
.p2align 3
.L35:
cmpl %esi, %edx
je .L33
movl %esi, %eax .p2align 4,,7
.p2align 3
.L34:
addl (%eax), %ebx
addl $4, %eax
cmpl %eax, %edx
jne .L34
.L33:
subl $1, %ecx
jne .L35
leal 68(%esp), %edx
movl %edx, 4(%esp)
leal 56(%esp), %esi
movl $1, (%esp)
const_iterator
ループ:
movl 60(%esp), %edx
movl $10, %ecx
movl 56(%esp), %esi
.p2align 4,,7
.p2align 3
.L38:
cmpl %esi, %edx
je .L36
movl %esi, %eax
.p2align 4,,7
.p2align 3
.L37:
addl (%eax), %ebx
addl $4, %eax
cmpl %eax, %edx
jne .L37
.L36:
subl $1, %ecx
jne .L38
leal 68(%esp), %edx
movl %edx, 4(%esp)
leal 56(%esp), %esi
movl $1, (%esp)