C++ 易失性成员函数的性能后果
我发现了一篇2001年关于Dobbs博士的文章:。我总是发现“volatile”有点没用——至少作为变量的限定词——因为访问线程之间共享的变量总是要经过某种库层 尽管如此,如本文所述,将类实例和方法标记为“volatile”以指示其线程安全程度似乎非常有说服力 为了快速总结本文,核心思想是可以声明如下类:C++ 易失性成员函数的性能后果,c++,multithreading,volatile,C++,Multithreading,Volatile,我发现了一篇2001年关于Dobbs博士的文章:。我总是发现“volatile”有点没用——至少作为变量的限定词——因为访问线程之间共享的变量总是要经过某种库层 尽管如此,如本文所述,将类实例和方法标记为“volatile”以指示其线程安全程度似乎非常有说服力 为了快速总结本文,核心思想是可以声明如下类: struct SomeObject { void SingleThreadedMethod(); void Method(); void Method() volatile; };
struct SomeObject {
void SingleThreadedMethod();
void Method();
void Method() volatile;
};
// An object that will only be accessed from a single thread.
SomeObject singleThreaded;
// An objecect that will be accessed from multiple threads.
volatile SomeObject sharedObject;
sharedObject.SingleThreadedMethod(); //this will be an compile error
sharedObject.Method(); // will call the volatile overload of Method
singleThreaded.Method(); // would call the non volatile overload of Method.
然后是类的实例,如下所示:
struct SomeObject {
void SingleThreadedMethod();
void Method();
void Method() volatile;
};
// An object that will only be accessed from a single thread.
SomeObject singleThreaded;
// An objecect that will be accessed from multiple threads.
volatile SomeObject sharedObject;
sharedObject.SingleThreadedMethod(); //this will be an compile error
sharedObject.Method(); // will call the volatile overload of Method
singleThreaded.Method(); // would call the non volatile overload of Method.
其想法是实现“Method()volatile”之类的方法:
void SomeObject::Method() volatile {
enter_critical_section();
const_cast<Method*>(this)->Method();
leave_critical_Section();
}
void SomeObject::Method()volatile{
输入_critical_section();
const_cast(this)->Method();
保留“关键”部分();
}
显然,智能指针可以自动执行原子锁并将其转换为非易失性进程——关键是在其预期用途中,可以使用易失性限定符来标记类成员和实例,以指示如何从多个线程使用它们,从而使编译器在单线程运行时告知开发人员正在对易失性对象调用(非易失性)方法,甚至自动选择线程安全版本
关于这种方法,我的问题是:“volatile”限定方法的性能影响是什么?编译器是否被迫假设volatile函数中访问的所有变量都需要被视为volatile,从而被排除在优化机会之外?局部变量是否会被排除在优化之外?这可能是一个很大的问题在任何易失性限定成员函数上拖动performance(如果有)。
- 不,局部变量在volatile方法中不会被假定为volatile,这与局部变量在const方法中不被假定为const的方式几乎相同
- 在volatile方法中,类的所有成员都将被视为volatile,这与在const方法中处理所有非可变成员的方式几乎相同。volatile没有等价的mutable
不会是易失性指针,因此访问它不会每次都从内存加载它。但是此
将是指向易失性的指针,这意味着此
被视为易失性指针*此
这个指针。但是,局部变量不应该受到影响。一些相关帖子:,我不“喜欢”很多问题,但我喜欢这个问题。问得好。这似乎是对规则最一致的解释。