【发布时间】:2014-12-01 18:03:32
【问题描述】:
使用 ocount 分析代码会显示更多的循环惩罚开启和更少的循环惩罚关闭。我试图理解为什么惩罚标志打开时会有更多的惩罚?
uint16_t arr[1010];
uint32_t r[500];
void func()
{
uint32_t i = 0;
for (i = 0; i < 1000; i+=2)
{
arr[i] = i;
arr[i+1] = i+10;
#ifdef PENALTY_ON
r[i/2] = *(uint32_t *)((uint16_t *)&arr[i+1]);
#endif
}
#ifndef PENALTY_ON
for (i = 0; i < 1000; i+=2)
{
r[i/2] = *(uint32_t *)((uint16_t *)&arr[i+1]);
}
#endif
}
【问题讨论】:
-
猜测,预取?如果没有惩罚,您可以不中断地预取整个
arr数组。 -
所有这些演员表都是必要的吗?它们非常嘈杂和分散注意力。目前还不清楚是否可以有意义地讨论未定义行为的表现。
-
实际上是模拟它的人做到了。我也在质疑这里所做的演员表。
-
你在什么处理器架构上运行代码?
标签: c pointers memory casting cpu-cycles