优化成员变量访问
Optimizing member variable access
可以C++编译器将以下循环优化为无限循环
this->m_stop=0;
while(!this->m_stop)
{
// do stuff
}
即使在单线程上下文中,此问题也是相关的,因为循环内的调用可能会间接影响状态标志。
如果循环的主体无法合法地更改m_stop
,那么这是一个允许的优化。
如果编译器在循环中看不到函数的内容,则必须假定它们可以更改m_stop
。
如果指向m_stop
或*this
的指针或引用存储在循环主体中运行的代码可访问的位置,则编译器必须进行更广泛的分析,以确定是否可以安全地假设m_stop
不会更改。如果它不能进行此分析,那么它必须假设如果循环的主体更改任何可能引用m_stop
的内容,m_stop
可能会发生变化。
编译器只能执行不影响格式良好程序的可观察行为的优化。这通常称为假设规则;程序的行为必须像由某个抽象机器按照标准执行一样,但是只要程序以相同的方式运行,实现就可以更改有关执行的内容,使其运行得更快。
因此,编译器无法将代码优化为无限循环,除非它可以证明它不会影响程序的可观察行为。当然,如果你在某个地方有未定义的行为,那么所有的赌注都是错误的。
如果
this->m_stop
是非易失性的,并且编译器可以知道this->m_stop
的值不会改变它的值(即条件将始终为真(。
也许它可以(在某些情况下(知道即使this->m_stop
不稳定,条件也会保持不变。但这种情况仍然意味着它仍然必须基本上评估循环中每次迭代的至少 this->m_stop
(即使它知道结果将是0
(。通常编译器不会知道这一点。
此外,如果编译器以某种方式知道该值将在循环的每个开始时0
,则this->m_stop
更改其值的情况也是可能的。
相关文章:
- 尝试通过多个向量访问变量时,向量下标超出范围
- 通过按地址访问变量
- 通过 get-Method 访问变量在类外不起作用
- 是否可以使用指针访问变量以避免直接编辑变量?
- 我无法访问变量的值,即使我通过范围传递了它
- 简单的问题 - 如何从单独的"结构"内的'class'访问变量?
- (C++) 从另一个类访问变量时值无效
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 是否可以从字符串访问变量?
- 变量 z 无法从其他函数访问变量 x
- 如何在 C++ 中从 void 返回函数访问变量
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 在C 中本地声明隐藏的封闭范围(而非全局)中访问变量
- 从函数中删除动态内存分配,但无法访问变量
- 如何从派生类中的基类访问变量的值?
- 如何通过指针更快地访问变量,然后直接访问变量?
- 如何在公共类 c++ 中访问变量的值
- 从 Visual Studio 中的多个源文件访问变量
- 使用命名空间和模板类访问变量
- 从子对话框访问变量