我有一个简单的函数,它通过引用获取两个变量:
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;
}
例如
如何使第一个示例生成与第二个示例相同的代码但没有额外的副本?