参照によって2つの変数を取る単純な関数があります:
void foo(int*& it2,
bit_reader<big_endian_tag>& reader2)
{
for(/* ... */)
{
*it2++ = boo(reader2.next());
// it2++ => 0x14001d890 add qword ptr [r12], 0x4
}
}
ここでの問題は、 forit2
とreader2
オプティマイザーが、ループ中にコンピューターにレジスターではなくメモリーへの書き込みをさせることです。
ただし、次のコードは、ループ中に変数を適切にレジスターに入れますが、ループの前後に不要なコピーの形で余分なオーバーヘッドがあります。
void foo2(int*& it2,
bit_reader<big_endian_tag>& reader2)
{
auto reader = reader2;
auto it = it2;
for(/* ... */)
{
*it++ = boo(reader.next());
// it++ => 0x14001d890 add r15, 0x4
}
reader2 = reader;
it2 = it;
}
例えば
最初の例で 2 番目の例と同じコードを生成するようにするにはどうすればよいですか?ただし、余分なコピーはありません。