-fno将严格别名作为函数属性
-fno-strict-aliasing as function attribute
我有一个函数,出于性能原因,我在其中键入punning。基本上,我有一个32乘32位的数组,存储为32 uint32s:的数组
struct Tile {
uint32_t d[32];
};
然后,我想计算32×32瓷砖的28×28"内部"的总体("1"的数量)。naive方法将对机器的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++(Ubuntu 4.8.4-2ubuntu114.04.1)4.8.4抱怨
- g++-4.6.real(Ubuntu/Linaro 4.6.3-1ubuntu5)4.6.3没有抱怨
- g++(Debian 5.3.1-5)5.3.1 20160101没有抱怨
g++4.8.4的Ubuntu风格有什么问题?
不要键入双关语。这是没有理由的。相反,请正确使用memcpy()
向int64_t
参数进行复制。优化器将完成其余工作。
相关文章:
- 主函数参数的属性
- C++调用具有 *this 属性的单个帮助程序函数
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- 如何在不知道属性具有哪些构造函数的情况下初始化属性?
- C++ 类/结构中的函数依赖属性
- C++ 中常量属性的初始化构造函数错误
- 在构造函数 c++ 中初始化属性时出现问题
- 静态类属性,C++中的多个构造函数
- 使用智能指针属性创建资源库函数?
- 模板化虚拟函数,管理单个类的不同类属性
- 使用类属性调用具有非类型模板参数的模板函数
- 设置使用 Cereal 序列化库时可以在序列化函数中访问的属性
- pybind11:属性错误:尝试从 py 文件运行函数时,模块'XXX'没有属性'YYY'
- 用于指示返回值生存期的C++函数属性和参数相同
- 为什么'mutable' lambda 函数属性,而不是捕获类型?
- -fno将严格别名作为函数属性
- gcc函数属性-如何使用它们
- 函数属性returns_twice
- Visual Studio 2015 Update 3 是否中断了构造函数属性