【发布时间】:2012-08-16 05:54:25
【问题描述】:
我有一个简单的函数,它通过引用获取两个变量:
void foo(int*& it2,
bit_reader<big_endian_tag>& reader2)
{
for(/* ... */)
{
*it2++ = boo(reader2.next());
// it2++ => 0x14001d890 add qword ptr [r12], 0x4
}
}
这里的问题是,对于it2 和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;
}
例如
如何使第一个示例生成与第二个示例相同的代码,但没有额外的副本?
【问题讨论】:
-
您希望如何更改
it2和reader2而无需写入存储它们的内存? -
我希望编译器在循环运行时将
it2和reader2保留在寄存器中,并且只在循环结束时将它们写回内存。 -
理论上可以,如果它还可以证明
boo(reader.next())永远不会受到更新值的影响。 -
我实际上希望写入到 L1 缓存,在这种情况下(没有存储加载依赖)可能和寄存器一样快。
标签: c++ visual-studio optimization