cv (const ΠΈ volatile) ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ ΡΠΈΠΏΠ°
ΠΠΎΡΠ²Π»ΡΡΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ΅ ΡΠΈΠΏΠ°, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ-ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ²-ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΡΡΡ ΠΈΠ»ΠΈ Π²ΠΎΠ»Π°ΡΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
const- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΡΠΎ ΡΠΈΠΏ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ.volatile- ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΡΠΎ ΡΠΈΠΏ ΡΠ²Π»ΡΠ΅ΡΡΡ volatile.
ΠΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅
ΠΡΠ±ΠΎΠΉ ΡΠΈΠΏ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ΠΏΠΎΠ»Π½ΡΠΉ), ΠΎΡΠ»ΠΈΡΠ½ΡΠΉ ΠΎΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΠΈΠ»ΠΈ ΡΡΡΠ»ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ° ΡΡΠΎ ΡΠΈΠΏ ΠΈΠ· Π³ΡΡΠΏΠΏΡ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΠ΅ΡΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ , Π½ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ²:
- cv-Π½Π΅ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ.
- const-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ.
- volatile-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ.
- const-volatile-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ.
ΠΡΠΈ ΡΠ΅ΡΡΡΠ΅ ΡΠΈΠΏΠ° Π² ΠΎΠ΄Π½ΠΎΠΉ Π³ΡΡΠΏΠΏΠ΅ ΠΈΠΌΠ΅ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ Π²ΡΡΠ°Π²Π½ΠΈΠ²Π°Π½ΠΈΡ.
Π‘ΡΠΈΡΠ°Π΅ΡΡΡ, ΡΡΠΎ ΡΠΈΠΏΡ ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² ΠΈΠΌΠ΅ΡΡ ΡΡ ΠΆΠ΅ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΈΡ, ΡΡΠΎ ΠΈ ΡΠΈΠΏΡ ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ².
ΠΠ±ΡΠ΅ΠΊΡΡ const ΠΈ volatile
ΠΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ (ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ°ΡΡΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ-ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ²-ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠ°ΡΡΡΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΎΡΠ° Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΡΠ°ΡΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°-ΡΠΈΠΏΠ° Π² Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ new) ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΡΡΡ ΠΈΠ»ΠΈ Π²ΠΎΠ»Π°ΡΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
- ΠΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠΎ
- ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΈΠΏ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌ, ΠΈΠ»ΠΈ
- Π½Π΅ mutable ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
- Π’Π°ΠΊΠΎΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅Π»ΡΠ·Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ: ΠΏΠΎΠΏΡΡΠΊΠ° ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ, Π° ΠΏΠΎΠΏΡΡΠΊΠ° ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΊΠΎΡΠ²Π΅Π½Π½ΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΡΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ΅ΡΠ΅Π· ΡΡΡΠ»ΠΊΡ ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΡΠΈΠΏ) ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.
- volatile ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠΎ
- ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΈΠΏ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ volatile-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ,
- ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅ΠΊΡ volatile ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΈΠ»ΠΈ
- ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅ΠΊΡ mutable const-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
- ΠΠ°ΠΆΠ΄ΡΠΉ Π΄ΠΎΡΡΡΠΏ (ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΠΈ, Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ Ρ.Π΄.) ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΠΌΡΠΉ ΡΠ΅ΡΠ΅Π· Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ glvalue volatile-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π²ΠΈΠ΄ΠΈΠΌΡΠΉ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ Π΄Π»Ρ ΡΠ΅Π»Π΅ΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ (Ρ.Π΅., Π² ΠΏΡΠ΅Π΄Π΅Π»Π°Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, volatile Π΄ΠΎΡΡΡΠΏ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ Ρ Π΄ΡΡΠ³ΠΈΠΌ Π²ΠΈΠ΄ΠΈΠΌΡΠΌ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΌ ΡΡΡΠ΅ΠΊΡΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ Π΄ΠΎ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½ ΠΏΠΎΡΠ»Π΅ volatile Π΄ΠΎΡΡΡΠΏΠ°. ΠΡΠΎ Π΄Π΅Π»Π°Π΅Ρ volatile ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΠΌΠΈ Π΄Π»Ρ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΡ Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠΌ ΡΠΈΠ³Π½Π°Π»Π°, Π½ΠΎ Π½Π΅ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΠΌΠΎΡΡΠΈΡΠ΅ std::memory_order). ΠΡΠ±Π°Ρ ΠΏΠΎΠΏΡΡΠΊΠ° ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ volatile ΠΎΠ±ΡΠ΅ΠΊΡΡ ΡΠ΅ΡΠ΅Π· glvalue Π½Π΅ volatile ΡΠΈΠΏΠ° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅ΡΠ΅Π· ΡΡΡΠ»ΠΊΡ ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° Π½Π΅ volatile ΡΠΈΠΏ) ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π½ΠΎΠΌΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ.
- ΠΠ±ΡΠ΅ΠΊΡ const volatile ΡΡΠΎ
- ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΈΠΏ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π΅Ρ const-volatile-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΈΡ,
- Π½Π΅ mutable ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅ΠΊΡ const volatile ΠΎΠ±ΡΠ΅ΠΊΡΠ°,
- ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅ΠΊΡ volatile ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΠ»ΠΈ
- Π½Π΅ mutable volatile ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
- ΠΠ΅Π΄ΡΡ ΡΠ΅Π±Ρ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈ ΠΊΠ°ΠΊ volatile ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΠ°ΠΆΠ΄ΡΠΉ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡ (const ΠΈ volatile) ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π² Π»ΡΠ±ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, const const ΠΈ volatile const volatile Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΌΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡΠΌΠΈ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ².
Π‘ΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ mutable
mutable- ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΊΠ»Π°ΡΡΠ°, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ mutable, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π΅Π³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌ (Ρ.Π΅. ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠ»Π°ΡΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ mutable).
ΠΠΎΠΆΠ΅Ρ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ Π½Π΅ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠ»Π°ΡΡΠ° Π½Π΅ΡΡΡΠ»ΠΎΡΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°:
class X
{
mutable const int* p; // OK
mutable int* const q; // Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ
mutable int& r; // Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ
};
mutable ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° Π²ΠΈΠ΄ΠΈΠΌΠΎΠ΅ ΠΈΠ·Π²Π½Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ° (ΡΡΠΎ ΡΠ°ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ², ΠΊΡΡΠ΅ΠΉ, ΠΎΡΠ»ΠΎΠΆΠ΅Π½Π½ΡΡ
Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄ΠΎΡΡΡΠΏΠ°).
class ThreadsafeCounter
{
mutable std::mutex m; // "ΠΡΠ°Π²ΠΈΠ»ΠΎ M&M": mutable ΠΈ mutex ΠΈΠ΄ΡΡ Π²ΠΌΠ΅ΡΡΠ΅
int data = 0;
public:
int get() const
{
std::lock_guard<std::mutex> lk(m);
return data;
}
void inc()
{
std::lock_guard<std::mutex> lk(m);
++data;
}
};
ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ
Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠ½ΠΎΠ΅ ΡΠΏΠΎΡΡΠ΄ΠΎΡΠΈΠ²Π°Π½ΠΈΠ΅ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΏΠΎ Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π½ΠΈΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ. Π ΡΠΈΠΏΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ, ΡΠ΅ΠΌ:
- Π½Π΅ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ <
const - Π½Π΅ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ <
volatile - Π½Π΅ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ <
const volatile const<const volatilevolatile<const volatile
Π‘ΡΡΠ»ΠΊΠΈ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½Ρ Π² ΡΡΡΠ»ΠΊΠΈ ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ, ΡΠΌΠΎΡΡΠΈΡΠ΅ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
Π§ΡΠΎΠ±Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΡΡΡΠ»ΠΊΡ ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΈΠΏ Π² ΡΡΡΠ»ΠΊΡ ΠΈΠ»ΠΈ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΠΌΠ΅Π½Π΅Π΅ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠΈΠΏ, Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ const_cast.
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡ const, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ Π½Π΅Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π½Π΅ volatile Π½Π΅ ΡΠ°Π±Π»ΠΎΠ½Π½ΠΎΠΉ (Π½Π°ΡΠΈΠ½Π°Ρ Ρ C++14)Π½Π΅ inline (Π½Π°ΡΠΈΠ½Π°Ρ Ρ C++17) ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π° ΠΊΠ°ΠΊ extern, Π΄Π°ΡΡ Π΅ΠΉ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅. ΠΡΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ C, Π³Π΄Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ°ΠΉΠ»Π° ΠΈΠΌΠ΅ΡΡ Π²Π½Π΅ΡΠ½Π΅Π΅ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅.
ΠΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ° ΡΠ·ΡΠΊΠ° C++ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅Ρ mutable ΠΊΠ°ΠΊ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ-ΠΊΠ»Π°ΡΡΠ°-Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ, Π° Π½Π΅ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΡΠΈΠΏΠ°, Π½ΠΎ ΡΡΠΎ Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° ΠΊΠ»Π°ΡΡ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅.
|
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π°ΡΠΈΠ°Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ volatile ΡΡΡΠ°ΡΠ΅Π»ΠΈ:
|
(Π½Π°ΡΠΈΠ½Π°Ρ Ρ C++20) |
ΠΡΠΈΠΌΠ΅Ρ
int main()
{
int n1 = 0; // Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
const int n2 = 0; // ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
int const n3 = 0; // ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ (ΡΠΎ ΠΆΠ΅ ΡΡΠΎ ΠΈ n2)
volatile int n4 = 0; // volatile ΠΎΠ±ΡΠ΅ΠΊΡ
const struct
{
int n1;
mutable int n2;
} x = {0, 0}; // ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ Ρ mutable ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠΌ
n1 = 1; // ok, ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
// n2 = 2; // ΠΎΡΠΈΠ±ΠΊΠ°: Π½Π΅ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΠ΅ΠΌΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ
n4 = 3; // ok, ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΉ ΡΡΡΠ΅ΠΊΡ
// x.n1 = 4; // ΠΎΡΠΈΠ±ΠΊΠ°: ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌ
x.n2 = 4; // ok, mutable ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠΎΠΉ
const int& r1 = n1; // ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ, ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΊ Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ
// r1 = 2; // ΠΎΡΠΈΠ±ΠΊΠ°: ΠΏΠΎΠΏΡΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΡΡΡΠ»ΠΊΡ Π½Π° const
const_cast<int&>(r1) = 2; // ok, ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ n1
const int& r2 = n2; // ΡΡΡΠ»ΠΊΠ° Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ, ΠΏΡΠΈΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΡ
// r2 = 2; // ΠΎΡΠΈΠ±ΠΊΠ°: ΠΏΠΎΠΏΡΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅ΡΠ΅Π· ΡΡΡΠ»ΠΊΡ Π½Π° const
// const_cast<int&>(r2) = 2; // ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΎ: ΠΏΠΎΠΏΡΡΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ
// ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ n2
[](...){}(n3, n4, x, r2); // ΡΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅: [[maybe_unused]]
std::system("g++ -O3 -Wa,-adhln ./main.cpp"); // ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠ΄Π°Π²Π°ΡΡ asm Π² ΡΠΈΡΡΠ΅ΠΌΠ°Ρ
POSIX
}
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄:
# ΡΠΈΠΏΠΈΡΠ½ΡΠΉ ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΊΠΎΠ΄, ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ Π½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ΅ x86_64
# (Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΡ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΠ΅Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌΡΠΌ ΠΏΠΎΠ±ΠΎΡΠ½ΡΠΌ ΡΡΡΠ΅ΠΊΡΠ°ΠΌ)
main:
movl $0, -4(%rsp) # volatile int n4 = 0;
movl $3, -4(%rsp) # n4 = 3;
xorl %eax, %eax # Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ 0 (Π½Π΅ΡΠ²Π½ΠΎ)
ret
ΠΡΡΡΡΡ ΠΎ Π΄Π΅ΡΠ΅ΠΊΡΠ°Ρ
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΡ Π±ΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Ρ Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΡΠΈΠ»ΠΎΠΉ ΠΊ ΡΠ°Π½Π΅Π΅ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½ΡΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ°ΠΌ C++:
| ΠΠΎΠΌΠ΅Ρ | ΠΡΠΈΠΌΠ΅Π½ΡΠ½ | ΠΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ | ΠΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ |
|---|---|---|---|
| CWG 1428 | C++98 | ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π±ΡΠ»ΠΎ ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΎ Π½Π° ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ | ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΎ Π½Π° ΡΠΈΠΏΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° |
| CWG 1528 | C++98 | Π½Π΅ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² |
Π½Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ cv-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° |
| CWG 1799 | C++98 | mutable ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ½ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ Π΄Π°Π½Π½ΡΡ
, Π½Π΅ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΌ ΠΊΠ°ΠΊ const, Π½ΠΎ ΡΠΈΠΏΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠΎΠ³ΡΡ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡΠΈΠΌΠ΅ΡΡ const-ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΈΡ |
Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ mutable ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠ΄Π°Π½Π½ΡΡ const-ΠΊΠ²Π°Π»ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠΈΠΏΠΎΠ² |
Π‘ΠΌΠΎΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ C ΠΏΠΎ ΠΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡ
const | |
ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ C ΠΏΠΎ ΠΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡ
volatile |