pointer->wald schrieb:
> static test x;
Die Initialisierung von statischen lokalen Variablen erfordert
Thread-Synchronisation, welche sich anscheinend beim default-Konstruktor
wegoptimieren lässt. Wenn 2 Threads gleichzeitig "inst" aufrufen muss
sichergestellt werden, dass die "x" Variable nur exakt 1x initialisiert
wird; da der eigene Konstruktor beliebigen Code enthalten kann, geht das
nur über Mutexe. Dass dein Controller ggf. gar kein RTOS mit Threads
nutzt weiß der Compiler nicht.
Die Lösung ist ganz schlicht eine Klassen-statische Variable zu
verwenden:
1 | class test {
|
2 | private:
|
3 | static test instance;
|
4 | public:
|
5 | static test& inst() {
|
6 | return instance;
|
7 | }
|
8 | };
|
Der Nachteil daran ist, dass der Konstruktor immer aufgerufen wird, auch
wennn "inst" niemals aufgerufen wird; dafür kann man den Konstruktor
auch ggf. "constexpr" machen, was die Initialisierung noch effizienter
macht.
Es ist auch besser eine Referenz statt eines Pointers zurückzugeben.