C++ 抛弃volatile关键字在这里有意义吗?
我有一个类实例,它可以与volatile关键字一起使用,也可以不与volatile关键字一起使用:C++ 抛弃volatile关键字在这里有意义吗?,c++,arduino,volatile,C++,Arduino,Volatile,我有一个类实例,它可以与volatile关键字一起使用,也可以不与volatile关键字一起使用: class C {}; volatile C v_c; C nv_c; 现在,我提出了以下构造来编写同时适用于易失性和非易失性实例的方法: class C { public: void method() { methodQualified(false); }; void method() volatile { methodQualified(); };
class C {};
volatile C v_c;
C nv_c;
现在,我提出了以下构造来编写同时适用于易失性和非易失性实例的方法:
class C {
public:
void method() { methodQualified(false); };
void method() volatile { methodQualified(); };
private:
void methodQualified(bool volatileSelf = true) volatile {
auto& nqThis = volatileSelf ? *this : *const_cast<C*>(this);
// Do stuff with nqThis
}
};
C类{
公众:
void method(){methodQualified(false);};
void method()volatile{methodQualified();};
私人:
void methodQualified(bool volatileSelf=true)volatile{
auto&nqThis=volatileSelf?*此:*const_cast(此);
//用nqThis做些事情
}
};
但是现在我想知道
methodQualified(false)
调用是否/如何改变编译器在易失性/非易失性实例上方法调用的行为。这个构造有意义吗?其基本思想是,只有在必要时使用volatile才有潜在的性能损失。这是为Arduino编写的代码。您可以检查生成的代码以查看编译器的功能。[编译器资源管理器](godbolt.org/)可以在线完成。为什么首先需要它是易失性的?把volatile放在后面扔掉似乎很奇怪…@OznOg我有一个类,它表示从ISR和主代码访问的数据(所以我使用volatile实例),而在其他地方,这些实例只是从主代码访问的(所以不需要volatile)。@Someprogrammerdude Thx,我试图通过godbolt找到一些东西,但是我需要一些帮助。在ESP8266上为Arduino开发时,我应该选择什么编译器?首先,我选择了这个选项,看起来似乎相同的代码用于易失性和非易失性访问。在这方面有更深入的见解的人能证实这一点吗?@x-ray不,这没有意义,auto
仍然是编译时类型,它只有一种类型。(嗯,类型只在编译时存在,但希望您理解我的观点)