[英]-fno-strict-aliasing as function attribute
我出于性能考虑而在其中进行类型调整的功能。 基本上,我有一个32×32位数组存储为32个uint32s数组:
struct Tile {
uint32_t d[32];
};
然后,我要计算32 x 32瓦片的28 x 28“内部”的人口(“ 1”的数量)。 天真的方法将对机器的popcnt指令进行28次调用,每行一次。 但是,由于popcnt可以采用64位参数,因此可以将其减少为14个popcnt调用:
int countPopulation(Tile* sqt) __attribute__((optimize("-fno-strict-aliasing"))) {
int pop = 0;
for (int i = 2; i < 30; i += 2) {
const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);
pop += __builtin_popcountll(v & 0x3ffffffc3ffffffcull);
}
return pop;
}
如果我不包括该属性:
__attribute__((optimize("-fno-strict-aliasing")))
那么,由于明显的原因,g ++会一直抱怨我的类型调整:
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
const uint64_t v = *reinterpret_cast<const uint64_t*>(sqt->d + i);
另一方面,如果我确实包含该属性,则某些g ++版本会抱怨,而其他版本则不会。 在尝试过的机器上,我得到:
g ++ 4.8.4的Ubuntu风格怎么了?
不要键入双关语。 没有任何理由。 而是正确地使用memcpy()
与int64_t
参数进行复制。 优化器将完成其余的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.