2013-10-09 10 views
8

Czy możesz podać przykład trywialny lub rzeczywisty, aby zademonstrować użycie niestabilnego konstruktora kopii?Do czego służy konstruktor ulotnych kopii?

Po prostu nie mogłem wymyślić.

+6

Gdy masz lotne obiekty, potrzebujesz niestabilnego narzędzia do kopiowania. Pytanie sprowadza się do tego: kiedy potrzebujesz lotnych obiektów? – Nawaz

Odpowiedz

8

jak @Nawaz już zauważył:

Kiedy masz lotnych obiektów, trzeba lotny copy-konstruktor. Pytanie sprowadza się do tego: kiedy potrzebujesz lotnych obiektów?

Głównym powodem użycia słowa kluczowego volatile jest zwykle wyłączenie optymalizacji. To znaczy, jeśli masz coś takiego:

bool flag = false; 
if(!flag) {} 

Kompilator będzie widać, że flaga nie może być zmieniony, więc nie ma potrzeby, aby sprawdzić flagę za każdym razem - tak nie będzie. Ale jeśli sprawisz, że flaga będzie zmienna, zmienna - będzie.

Oto opinia lotnej kluczowego pierwotnego użytku: link

W skrócie, to było pierwotnie używane do dostępu do sprzętu poprzez MMIO, co może być nieco nietypowe:

unsigned char* pControl = 0xff24 ; 
*pControl = 0 ; 
*pControl = 0 ; 
*pControl = 0 ; 

i nie aby te 3 przypisania stały się jednym z powodu optymalizacji.

A oto papier Andrei Alexandrescu na lotny w wielowątkowego oprogramowania: link

Były jakieś papiery krytykujące papier Alexandrescu, ale nie mogłem go znaleźć. Chodziło o to, że odrzucił lotną własność i tak dalej.

Należy pamiętać o bardzo ważnej rzeczy na wielowątkowość, podkreślił @JanHudec:

volatile jest całkowicie bezużyteczne dla wielowątkowych kontekście, ponieważ podczas uniemożliwia optymalizację, nie generuje wyraźne bariery. Bez tych zapisów na jednym CPU może nie być widoczny inny procesor (architektura zależna, x86 ma spójne pamięci podręczne, więc zapisy są zawsze widoczne).

Również volatile nie wymusza operacji atomowej. Przy zadaniu x86 jest zawsze atomowe, ale nie ma to miejsca w przypadku wszystkich architektur procesorów. A bardziej złożone operacje, takie jak inkrementacja, mogą być dokonywane tylko atomowo przy użyciu std::atomic.

+0

Opinia nie jest dostępna, spróbuj użyć poprawnego linku stałego. – Zeta

+0

@Zeta - dzięki. URL został jakoś zepsuty; edytowane. –

+3

'volatile' jest całkowicie bezużyteczny w kontekście wielowątkowym, ponieważ podczas gdy uniemożliwia optymalizację, nie generuje wyraźnych barier. Bez tych zapisów na jednym CPU może nie być widoczny inny procesor (architektura zależna, x86 ma spójne pamięci podręczne, więc zapisy są zawsze widoczne). –