- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果我理解正确,__declspec(noalias)
会告诉编译器作为参数传递的所有指针都没有别名。
__declspec(noalias) void multiply(float * a, float * b, float * c)
{
...
}
换句话说,如果我没记错的话,它完全等同于对每个指针类型的参数调用__restrict
。但是有没有办法在不改变所有函数调用的情况下做到这一点呢?理想情况下,我会将 __declspec(noalias)
替换为预处理器定义。
最佳答案
我认为您对 noalias
的解释不正确;它与在每个参数上指定 __restrict
不同。在example you reference from MSDN ,这意味着 a
、b
和 c
不修改或引用(当前编译单元的)任何全局状态,但它们可以自由地互相使用别名。您可以也在每个上指定__restrict
以指示它们不会互为别名。我不确定您为什么提到在这种情况下更改所有函数调用;只要没有调用者为参数设置别名,调用站点就不会发生任何变化。您应该检查所有调用,但除非您需要删除别名,否则无需更改它们。具体来说,调用站点不需要 __restrict
。
GCC 中唯一类似的是在同一源文件(属于兼容类型)。参见 more commonly for GCC关于文件范围 restrict
限定的指针。当然,不能保证 GCC 的行为会有任何不同,因为 restrict
通常只在函数范围内被考虑。 Microsoft 明确引入了 noalias
以启用他们引入的特定优化。
长话短说,这里没有宏技巧(除了 R 提到的在 GCC 上完全忽略 __declspec()
的技巧)。最好的办法是将 __restrict
添加到任何非别名指针参数和全局变量声明中。
关于c - 如何在 GCC 上移植 __declspec(noalias),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9648991/
我是一名优秀的程序员,十分优秀!