技术问询:__declspec(noalias)是否为无操作指令?与__attribute__((const))的特性对比及优化差异
技术问询:declspec(noalias)是否为无操作指令?与__attribute((const))的特性对比及优化差异
先给你理清这两个特性的核心关联:GCC/Clang的__attribute__((const))和MSVC的__declspec(noalias)算是近似但不完全等价的特性——两者都明确表达了函数调用不会修改或引用可见的全局状态这一语义。不过在参数相关的约束保证上,二者存在一些细微差别,但如果是无参数的函数,这两个特性的效果就完全一致了。
不过在实际的编译器优化表现上,两者差异很明显。我给你举个具体的代码例子:
void f(int* res) { res[0] = noGlobalAccess(); res[1] = noGlobalAccess(); res[2] = noGlobalAccess(); }
如果我们给noGlobalAccess()加上__attribute__((const))标记,GCC和Clang会智能推断出这个函数只需调用一次,然后把结果复制到三个目标数组位置上;但换成MSVC的__declspec(noalias)标记该函数的话,编译器并不会做这种复用结果的优化,仍然会老老实实执行三次函数调用。
备注:内容来源于stack exchange,提问作者Ofek Shilon
相关产品推荐
相关产品推荐

