【发布时间】:2016-12-26 13:55:35
【问题描述】:
有没有办法在clang 中声明一个变量是非别名的,以便在使用该变量的地方进行更多优化?
我了解restrict 可用于将指针声明为非别名。
但是,我也想知道可以指向的变量。我猜(也许是错误的)编译器必须小心假设可以允许它缓存变量值而不是每次都重新获取它的东西。
例子:
class Data
{
public:
void updateVal() {
// Updates m_val with some value each time it's called (value may differ across different calls)
...
}
int complicatedCalculation() const {
return 3 * m_val + 2;
}
int m_val;
};
class User
{
User(Data& data) : m_data{data} {}
void f()
{
m_data.updateVal();
for (int i=0; i<1000; ++i)
g();
}
void g()
{
// Will the optimizer be able to cache calc's value for use in all the calls to g() from f()?
int calc = m_data.complicatedCalculation();
// Do more work
...
}
Data& m_data;
};
即使示例代码中问题的答案是“是”,如果代码更复杂(例如工作在// Do more work 下),由于指针的可能性,它可能不会变为“否”指针可能指向m_data.m_val 的地方正在修改内容?或者这是编译器假设永远不会发生的事情,除非它看到 m_val 的地址被带到代码中的某个地方?
如果它不假设,或者即使它假设,但m_val的地址确实被带到某个地方(但我们知道它的内容不会是修改),那么能够将m_val 标记为“安全”以消除别名问题会很好,因此可以假设它的值不会被指针访问更改。
【问题讨论】:
-
您在寻找restrict 吗?
-
好的,谢谢。不过,我也想知道非指针变量;将提供更多详细信息。
-
添加了更多细节。
-
为避免任何问题,您可以自己缓存
calc值,并将该值传递给g。m_val可以通过修改int*、Data*或User*或char*来修改。
标签: c++ clang compiler-optimization strict-aliasing