Psihologija Priče Obrazovanje

Red i mir. smirenost

Kada se čini da je sljedeća razina prijeđena, Sjene će sigurno ispuzati i provjeriti održavaju li ravnotežu i prisebnost tijekom svojih plesova.

Reakcija na Sjenu zanjiše klatno ega i otkriva nemilosrdnu istinu: ravnoteža je napeta poput opreza hodača po žici i sprema se baciti hrabrog čovjeka u ponor prošlosti.

Prava ravnoteža je odsutnost pristranog promatranja: potraga za onim što se ovdje događa što nije u redu.

„Sve je kao i obično“, kaže unutarnji kontemplator, čak i ako okolo vlada kuga ili pljušte prijetnje, „samo su ti ljudi ranjeni i trebaju biti svjesni svog puta.

Ali ako bude drugih reakcija, onda put nije dovršen i dovršetak etape tek slijedi.

- Što će mi ovo? – Tek ste na početku svog putovanja kroz razinu.
Spreman sam boriti se do smrti! Vi ste na četvrtini puta.
Volim ovu vrstu avanture! - pola puta je već prošlo.
- Dođi k meni, ja ću te spasiti - prešao si tri četvrtine puta.
– Kako sam ti zahvalna što si baš takva! – 2/10 puta do kraja razine.
– Putniče, kamo si krenuo i što želiš postići svojom agresijom? - Prošli ste ovu razinu i polažete prijeteći ispit u sjeni.

U The Shadowu ima puno ljubavi i puno umjetnosti. Kao dobra učiteljica, savršeno glumi Tiranina, Žrtvu i Spasitelja kako bi testirala vašu ravnotežu. Uostalom, jezikom igrača: RAVNOTEŽA JE BOŽJA RAZINA.

©Mark Ifraimov

********

PRAVILA MIRA

Pripremite se otpustiti.

Ljudi koji vas zavaravaju, manipuliraju, krive, žale se, nesretni su, izluđuju, uskraćuju vam emocionalni mir.

Budite ravnopravni.

Tu ravnopravnost, u kojoj je svatko odgovoran za svoj život, a ne čeka da ga netko usreći ili mu kaže kako da živi.

Budite na oprezu.

Ne podliježite prigovorima i manipulacijama. Odnosi su prisutnost u životu drugoga, a ne njegovo spasenje. Ne smije se brkati s izravnim zahtjevom za pomoć. Pitajte - pomoći koliko god je to moguće za vas.

Pripremite se za odlazak.

Ne upuštajte se u demontažu i optužbe. Nemoj se opravdavati. Ako griješite, ispričajte se. To je dovoljno. Ako ste nanijeli veliku štetu nečijim osjećajima, zapitajte se što se može učiniti da se iskupi? Ako nema odgovora, budite spremni odmaknuti se. Ovdje se ne radi o tvojoj krivnji, nego o njegovim optužbama.

Budite čvrsti.

„Hvaljen si - ne raduj se. Oni grde - nemojte se uzrujavati ”(c). Ne možete pobjeđivati ​​ili gubiti cijelo vrijeme. Ne možete sve ni podijeliti na gubitak i dobitak. Pronađite ono što ste naučili i što ste otkrili u sebi zahvaljujući ovom događaju. Nastavi svojim putem, čvrstim korakom.

Budite prolazni.

Zaobiđite tuđe sukobe, ogovaranja, kategoričnost, ocjenjivanje, ljutnju, osvetu, kukanje, etikete, zavist. Ne miješaj se u sve ovo, ne podržavaj, ne gubi vrijeme... Hajde...

Pripremite se za odlazak.

Nastavljamo se upoznavati s jezičnim inovacijama standarda C ++ 17. U ovom ćemo članku razmotriti ono što bih nazvao nastavkom oplemenjivanja jezika. Oni. ovdje nećemo vidjeti nikakve potpuno nove, sa stajališta funkcionalnosti, stvari - radije, dovođenje stare funkcionalnosti u prihvatljivije stanje. Ovdje ćemo pogledati što se promijenilo s redoslijedom izvršavanja podizraza, koja su se nova jamstva pojavila u pogledu isključenja neobaveznog kopiranja, a također i što je dodano lambdama.

Dovođenje stvari u red

Mnogi C++ programeri naišli su na "zanimljive" probleme u kojima je zadan neki kontroverzni kod i pitanje je: "Što će biti izlaz?". Jedan uobičajeni primjer takvog koda je sljedeći primjer:

Int i = 0; i = i++ + i++;

Takav "pametni" kod nalazi se i na mreži iu intervjuima. Svrha takvih pitanja je saznati koliko je odgovor upoznat s osobitostima redoslijeda izvršavanja izraza u C ++.

Barem je to deklarirani cilj. Istina, vjerujem da u većini slučajeva osoba koja postavlja takva pitanja samo želi zabaviti svoju taštinu. Znati što će takav kod ispisati potpuno je neobavezno, jer se takav kod jednostavno ne može napisati. A budući da ne znate pisati, zašto pitati podnositelja zahtjeva o tome? Takva su pitanja prikladna za "pušače" gdje kolege programeri raspravljaju o rubnim slučajevima; nisu prikladni za intervjue. Preporučam pročitati razmišljanja Raymonda Chena o ovoj temi: "Pišu li ljudi sulud kod s višestrukim preklapajućim nuspojavama s jasnim licem?"

Ali ovo je patološki slučaj koji je vidljiv golim okom i, kao što sam već rekao, normalan programer nikada neće tako napisati. Ali postoje manje očiti slučajevi koje čak i iskusni programeri mogu napisati. Pogledajmo ovaj dio koda:

Void f2() ( std::string s = "ali čuo sam da radi čak i ako"ne vjerujete u to"; s.replace(0, 4, "") .replace(s.find("čak" ), 4, "samo") .replace(s.find("don"t"), 6, ""); assert(s == "Čuo sam da radi samo ako vjeruješ u to"); )

Ovaj kod je predstavljen u Stroustrupovoj najnovijoj knjizi, The C++ Programming Language 4th Edition, u odjeljku 36.3.6, i na prvi pogled izgleda prilično upotrebljivo i ispravno. Ali to je samo na prvi pogled, zapravo nema jamstava da će gornji kod formirati očekivani niz i, prema tome, tvrdnja neće raditi.

Kao što vidimo, čak je i kreator C++-a pogriješio u tako malom dijelu koda. Što kaže? Prije svega, da ne trebate trpati hrpu koda u jedan izraz u kojem se događa mnogo različitih stvari. Prva verzija ovog koda, koja je predstavljena na istoj stranici knjige, puno je jednostavnija i bolja:

Void f() ( std::string s = "ali čuo sam da radi čak i ako ne vjerujete u to"; s.replace(0, 4, ""); s.replace(s.find(" čak"), 4, "samo"); s.replace(s.find("don"t"), 6, ""); assert(s == "Čuo sam da radi samo ako vjerujete u to" );)

Ova opcija nije ispravna samo sa stajališta izvođenja programa, nego je i lakša za čitanje. Ali to nije jedini zaključak koji moramo izvući, postoji još jedan koji su autori prijedloga P0145R3 već napravili za nas: nešto nije u redu s redoslijedom izvršavanja podizražaja izraza u C++.

stari poredak

Prije nego što prijeđemo na sam prijedlog i promjene do kojih je dovelo njegovo usvajanje, predlažem da podsjetimo na važeći pravilnik. Ovo će pomoći osvježiti (i pomoći nekome da sazna) zašto su 2 gornja primjera loš C++ kod (samo u smislu jezika, ne estetike). Dakle, za razliku od mnogih drugih programskih jezika, u C++ redoslijed izvršavanja podizražaja u izrazima nije određen standardom i prepušten je prevoditelju. Naravno, još uvijek postoji određeni red, ali neću ovdje opisivati ​​sve suptilnosti, jer. ima ih dovoljno. Važno je razumjeti da se, u pravilu, 2 podizraza jednog velikog izraza izvršavaju neovisno jedan o drugom u neodređeno poredak (velika iznimka od ovog pravila je operator zarez ",").

Na primjer, uzmimo naš prvi primjer: i = i++ + i++; . U velikom izrazu postoje 4 mala podizraza: i , i++ , i++ i i++ + i++ . Što jamči standard C++14? Jamči (expr.ass) da su oba i++ izraza procijenjena prije nego što se izračuna njihova suma i da je i izraz procijenjen prije nego što mu se dodijeli rezultat zbroja. Također vas podsjećam da i++ izraz vraća staru vrijednost i, a zatim povećava i za jedan (inkrementira). To pak znači da se izraz smatra procijenjenim kada se primi stara vrijednost i.

Stoga se ispostavlja da prevodilac može odabrati nekoliko načina za procjenu punog izraza: nije ograničen kada se učinak ++ treba primijeniti na i . Kao rezultat toga, možemo dobiti različite vrijednosti u i, što, naravno, nije dobro, jer program bi trebao proizvesti predvidljiv rezultat koji je neovisan o hirovima prevoditelja. Na primjer, redoslijed može biti:

    Izračunamo prvi i, on je jednak 0.

    Izračunavamo drugi i, on je jednak 0.

    Zapišemo rezultat drugog inkrementa, dobijemo i == 1 .

    Zapišemo rezultat prvog inkrementa, dobijemo i == 2 .

    Izračunajte i lijevo od znaka jednakosti.

    Izračunaj zbroj: 0 + 0 == 0 .

    Rezultat zbroja upisujemo u i.

    Vraćamo rezultat punog izraza, tj. i , što je 0 .

Gornje korake možete učiniti bilo kojim redoslijedom koji ne krši jamstva koja pruža standard, a kao rezultat ćete dobiti različite odgovore.

Usput, možete razmotriti jednostavniju opciju: i = ++i + i++; . Ovdje možete odmah vidjeti da će rezultat biti različit ovisno o tome što će se prvo ocijeniti ++i ili i++ , jer prvi izraz ima nuspojave (povećanje i za jedan) prije nego što se procijeni.

Iako je druga opcija ilustrativnija, obje daju tzv nedefinirano ponašanje(NP, engleski nedefinirano ponašanje). Svi iskusni C++ programeri upoznati su s ovim izrazom, ali malo ljudi zna sva mjesta u C++ jeziku gdje se ovakvo ponašanje može pojaviti. Ovo je široka i prilično zanimljiva tema, koja se može obraditi u više članaka, pa se neću detaljnije zadržavati na njoj. Zapravo, tako detaljna analiza izraza nije bila potrebna, jer prema standardu (intro.execution/p15 ) naš izraz je NP već zato što u jednom izrazu postoje dva podizraza koji modificiraju isti skalarni objekt, a redoslijed promjena nije definiran. Zašto sam onda dao ovu analizu? Pokušao sam pokazati zašto NP se očituje na temelju trenutnih ograničenja u izvršavanju izraza, tj. cilj je bio pokazati da uz sadašnja pravila standard nema drugog izbora nego slegnuti ramenima.

Sada prijeđimo na naš drugi primjer i shvatimo što s njim nije u redu. Radi lakšeg razumijevanja, skratit ću ovaj primjer na ovaj izraz: s.replace(s.find("čak"), 4, "samo"). Što imamo ovdje? Postoji objekt s, postoji poziv funkcije članice std::string::replace, još jedna funkcija std::string::find i argumenti za te funkcije. Kakva nam jamstva daje standard? Standard jamči da se argumenti funkcije procjenjuju prije poziva funkcije. Također osigurava da objekt na kojem se funkcija izvršava mora biti procijenjen prije nego što se na njemu pozove funkcija. Sve je to jasno i logično. Istina, nemamo drugih jamstava: nema jamstva da će s biti evaluiran prije nego što se evaluiraju argumenti funkcije zamjene, a također nema jamstava u pogledu redoslijeda kojim se ovi argumenti evaluiraju. Stoga možemo dobiti ovaj redoslijed vrednovanja: s.find("even") , "only" , 4 , s , s.replace(...) . Ili bilo koji drugi koji ne krši prethodno određena jamstva standarda.

Iz gornjeg teksta potrebno je razlikovati 2 glavne točke: 1) izrazi lijevo i desno od točke mogu se vrednovati bilo kojim redoslijedom, 2) argumenti funkcije mogu se vrednovati bilo kojim redoslijedom. Na temelju toga sada bi trebalo biti jasno zašto je šifra iz Stroustrupove knjige netočna. U izrazu:

S.replace(0, 4, "") .replace(s.find("čak"), 4, "samo") .replace(s.find("don"t"), 6, "");

Oba poziva traženja mogu završiti prije nego što se dovrše prethodne (u kodu) zamjene. A možda i poslije. Čak i prvi može prije, a drugi kasnije - ne zna se, jer redoslijed nije definiran. Kao rezultat, ovaj kod daje nepredvidiv rezultat, iako to nije NP. Međutim, kao što rekoh, kompetentan programer neće napisati takav kod, a to što se nalazi u Stroustrupovoj knjizi ne znači da bi on tako napisao - samo je naveo primjer lanca poziva.

Osim toga, lanac poziva možda neće biti tako eksplicitan. Na primjer, ovdje je kod:

std::cout<< first << second;

Ovo je također lanac poziva, koji može biti ovakav:

std::cout.operator<<(first).operator<<(second);

ili ovako:

operater<<(operator<<(std::cout, first), second);

Razlika nije temeljna. Ako se iznenada prvi i drugi izrazi nekako odnose na isti objekt, a jedan od tih izraza modificira ovaj objekt, tada postoji velika vjerojatnost da ćemo dobiti nestabilan kod na izlazu, ili NP.

Još jedan zanimljiv primjer iz gornje rečenice:

std::map rječnik; rječnik = rječnik.veličina();

Da, kod izgleda besmisleno, ali što će dati kao rezultat? Čak bi i besmisleni kod trebao dati predvidljive rezultate. Nažalost, C++ u stilu 2014. samo sliježe ramenima - ne znam, kažu.

Funkcije i operatori

Kada smo pogledali lanac poziva, dotakli smo se još jedne zanimljive točke: u što se zapravo pretvara poziv na std::cout<< first << second; . Как мы уже видели, в зависимости от того, чем являются first и second , мы можем получить либо цепочку вызовов функций-членов, либо же вложенные вызовы свободных функций. Но ведь в изначальном варианте записи у нас есть три выражения и 2 оператора << , у нас нет вообще никаких функций!

Malo je vjerojatno da je ovaj kod prouzročio probleme C ++ programerima: prije ili kasnije svi naučimo o preopterećenju operatora i sve to uzimamo zdravo za gotovo, ali postoji jedna nijansa u ovom preopterećenju. Da pokažemo ovu nijansu, napišimo sljedeći predložak funkcije:

Predložak << "first\n", value++) && (cout << "second\n", value++); }

Da, predložak nije najkorisniji i najistaknutiji, ali, kao što ćemo sada vidjeti, vrlo je indikativan. Pozovimo funkciju cleverFun s argumentom int, koja će instancirati ovu funkciju:

Bool cleverFun(int& vrijednost) ( ​​return (cout<< "first\n", value++) && (cout << "second\n", value++); }

Kada se ova funkcija pozove, izlaz je zajamčeno:

ako će prva vrijednost++ vratiti 0, inače će biti ovako:

Prva sekunda

I nema drugih, što je očito: postoji snažno jamstvo za && operator kratki spoj(KZ, engleski short-circuit) i izvođenje lijevog boka u desno. S druge strane, ako kreiramo neki tip Int za koji redefiniramo i postfiks operator++ i operator&&, a zatim instanciramo naš predložak s njim, dobit ćemo sljedeću funkciju:

Int cleverFun(Int& value) ( ​​​​return (cout<< "first\n", value.operator++(0)) .operator&&((cout << "second\n", value.operator++(0))); }

Nisam počeo otkrivati ​​u što će se pretvoriti cout poziv, kako ne bih još više zatrpao ionako ne baš lako čitljiv kod. Na temelju onoga što smo do sada pokrili, ne bi vas trebalo iznenaditi da će se izlaz iz ovog koda razlikovati od onoga što dobijete za uobičajeni int. Ovdje također možete dobiti 2 opcije, ali one će biti različite:

Prva sekunda

Prvo drugo

Očito, ne možemo dobiti opciju s jednim prvim zbog činjenice da kratki spoj za redefinirane operatere ne radi. Ako pažljivo pogledate ovaj primjer, trebali biste razumjeti zašto: da biste izvršili nadjačani operator&& , argument se mora procijeniti za njega (tj. zbogom kratkom spoju), osim toga, kratki spoj radi samo kada je izraz s lijeve strane bool , koji u slučaju nadjačavanja ne može postojati operator. Dakle, o kratkom spoju ne može biti nikakvih iluzija - on za redefinirane operatere ne postoji i nikada neće.

Pa, ne može biti kratkog spoja, tako da ne možemo dobiti opciju prvog izlaza (samo prvi), ali čak i opcija s dvije linije izlaza može, ali i ne mora biti drugačija! Razmislite samo o tome: imamo isti kod unutar predloška funkcije, koji se s nekim argumentima predloška izvršava prema jednim pravilima, a za druge prema sasvim drugim.

To je sve zato što se u C++14 jamstva za operatore i njihove operande razlikuju ovisno o tome koji su operandi. Prema standardu, za integralne tipove, sva jamstva operatora rade onako kako su za njih opisana u standardu, ali za nadjačane operatore, pravila koja kontroliraju pozive funkcija već rade. Oni. za prevladane operatore, prevodilac “prepisuje” izraz u lanac poziva funkcije, a nakon toga se primjenjuju pravila iz standarda koja su definirana za takav lanac. Nijedno jamstvo operatera iz standarda ne odnosi se na nadjačane operatore..

Sve prethodno opisano daje vrlo sumornu sliku: previše je kaosa u C++-u u pogledu vrednovanja izraza. Nije ni čudo što je ljudima dosadilo trpjeti takve stvari, a vječite izjave kako je sve to potrebno za nekakve mitske optimizacije i ne treba mijenjati prestale su se smatrati dovoljnim opravdanjem. Zdrav razum je prevladao i C++17 je dobio nekoliko promjena kako bi počistio ovaj nered. A kakve smo promjene sada i razmotriti.

Novi poredak

Prva promjena koju donosi C++17 je redoslijed ispunjenje postfiksni operatori, operatori dodjele i operatori pomaka po bitovima. Sada se svi postfiksni operatori, kao i operatori bitovnog pomaka, izvode slijeva na desno, dok se operatori dodjele obrnuto, s desna na lijevo. Pod "izvršenjem", u ovom kontekstu, mislim na to da je izraz procijenjen (tj. njegov rezultat je vraćen), a sve nuspojave povezane s njim su predane.

Da bismo objasnili kako su izrazi sada poredani, uzmimo primjer iz rečenice (u primjeru ispod, prvo se izvršava izraz a, zatim b ):

A.b a->b a->*b a(b1, b2, b3) b @= a a[b] a<< b a >>b

Gdje je @ bilo koji operator koji vrijedi u ovom kontekstu (npr. + ). Stoga, na temelju novih pravila, primjer dat u Stroustrupovoj knjizi o C++11 konačno postaje točan u C++17 i uvijek će proizvesti točan i očekivani rezultat. Kao što vidite, nova pravila ne utječu na redoslijed izvršavanja argumenata funkcije u odnosu jedan na drugi: oni se i dalje mogu izvršavati bilo kojim redoslijedom, ali njihovo se izvršavanje ne može ispreplitati jedno s drugim. Drugim riječima, poredani su jedni u odnosu na druge, ali redoslijed nije reguliran.

Sada pogledajmo neke "zanimljive" primjere koje smo imali u C++14 NP, ali u C++17 je nestao. Ove primjere dajem isključivo za vlastitu konzumaciju, molim vas da ne mučite ljude njima u intervjuima.

I=i++; f(++i, ++i) f(i++, i++) niz = i++ i<< i++ cout << i++ << i++

Ali ti primjeri ostaju NP u novom standardu:

I = i++ + i++ i = ++i * i++

Zato što nisu dodana pravila koja reguliraju redoslijed kojim se izvršavaju podizrazi aritmetičkih operatora. Ali činjenica da NP nestao iz ovih primjera uopće ne znači da je vrijeme da zasitite svoj kod sličnim - ne. Svaki od ovih primjera zahtijeva pažljivu pozornost i dokaz da nije NP. Oni. svaki programer koji vidi ovakav kod bit će prisiljen stati, sjetiti se (ili se popeti u standard) i pobrinuti se da vidi ispravan kod ispred sebe. Kod ne treba biti "pametan", kod treba biti razumljiv.Štoviše, takva kombinacija izraza daje zapravo malo.

Usput, pažljivi čitatelj sigurno je primijetio crtu cout<< i++ << i++ в вышеприведённых примерах, и если он не знает обо всех правилах и поверил автору, то он наверняка воспользовался такой логикой: пример переписывается как

cout.operator<<(i++).operator<<(i++)

nakon čega nova pravila za . pa kod nema NP. Takvo se razmišljanje čini logičnim, ali ne i posve istinitim. Zapravo, sve je jednostavnije: kompilator stvarno "prepisuje" primjer u onaj koji sam dao, ali se redoslijed izvršenja gradi prije ponovnog pisanja! Oni. prema novim pravilima preopterećeni operatori poštuju pravila izvršavanja za ugrađene operatore, barem u smislu redoslijeda kojim se procjenjuju podizrazi. Dakle, na temelju činjenice da lijevi operand operatora<< вычисляется до правого у нас и нет NP u šifri.

Ispostavilo se da više nemamo odstupanja u redoslijedu kojim će se izvršavati izrazi za ugrađene i preopterećene operatore, a naš primjer iz prethodnog odjeljka:

Predložak bool cleverFun(T& vrijednost) ( ​​return (cout<< "first\n", value++) && (cout << "second\n", value++); }

za bilo koju vrstu uvijek će prvi ispisati prvi pa drugi. Obrnuti redoslijed izlaza sada je isključen standardom. Ovo je, naravno, vrlo važna inovacija koja vam omogućuje razmišljanje o kodu koji je napisan, a ne o tome što će se iz njega generirati. Zanimljivo je primijetiti da je ova inovacija stvorila razliku između eksplicitnog i implicitnog pozivanja preopterećenog operatora. Razmotrite primjer:

#uključi korištenje imenskog prostora std; class SomeClass ( friend int operator<<(const SomeClass& obj, int&); public: SomeClass(int var): m_Var{var} { } private: int m_Var; }; int operator<<(const SomeClass& obj, int& shift) { return obj.m_Var << shift; } int main() { int i = 0; int result = SomeClass{i = 1} << (i = 2); cout << "First result: " << result << "\n"; result = operator<<(SomeClass{i = 1}, i = 2); cout << "Second result: " << result << "\n"; };

Prvi rezultat je zajamčeno 4, dok drugi može biti 2 ili 4. Ovaj primjer dobro pokazuje razliku između eksplicitnog i implicitnog pozivanja preopterećenog operatora u C++17.

Očito se uvođenjem novog poretka pojavilo mnogo različitih složenih izraza koji su davali NP-ovi u prošlim standardima sada su važeći, ali to ne znači da bi se trebali početi masovno pojavljivati ​​u kodu. Ne bi trebalo biti samo zato što jesu kompleks, a sve što je teško shvatljivo treba izbjegavati. Ali nova pravila nam daju ne samo mogućnost pozivanja funkcija kao što je f(i++, i++) bez straha da će se program pokvariti. Nova pravila daju C++ kodu više strogosti i reda, zahvaljujući čemu, između ostalog, sada možemo pisati pouzdan kod s lancem poziva (eksplicitnih ili implicitnih, nije bitno).

Iako sam rekao nešto "fi" o kodu u Stroustrupovoj knjizi, daleko sam od anti-lančanja, a ako pogledamo moderni kod napisan korištenjem imperativnih jezika, možemo vidjeti da sadrži sve više i više lanaca (na primjer, LINQ i Task+ContinueWith iz C#, ili Lodash/podvlaka i Promise+zatim iz JS). C++ se također kreće u tom smjeru i uskoro ćemo vidjeti Range-v3 i future+then ekvivalente gornjim primjerima u budućim C++ standardima. Ali i prije izlaska novih standarda, možemo koristiti razne biblioteke čije sučelje potiče korištenje lanca poziva.

Sve u svemu, po mom mišljenju, promjena pravila za vrednovanje izraza jedna je od najvažnijih inovacija u C++17 koju će malo ljudi primijetiti, jer će sve (ili gotovo sve) jednostavno raditi kako treba. zdravom razumu. I svakim danom ima sve više zdravog razuma u standardu C++.

Minimiziranje kopiranja

Jedan od prvih koraka u učenju C++ je naučiti konstruktor kopiranja. Uostalom, uz pomoć njega možete lako odrediti što i kada se kopira. Oni. napišemo vlastitu klasu, tamo dodamo konstruktor kopije, u koji ispisujemo izlaz kroz cout, i uživamo u izlazu, na temelju čijeg rezultata saznajemo koliko smo kopija napravili.

S pojavom semantike poteza situacija se nešto zakomplicirala, pa radi cjelovitosti sada trebamo izraditi i konstruktor poteza. Ali za ovaj dio, to nije važno, jer. sve sljedeće vrijedi i za kopiranje i za premještanje.

Na primjer, napišimo sljedeći kod:

#uključi korištenje imenskog prostora std; class SomeClass ( public: SomeClass() = default; SomeClass(const SomeClass&) ( cout<< "Copy ctor called.\n"; } }; SomeClass meReturn() { return SomeClass{}; } int main() { auto some = meReturn(); };

Koliko će se puta izraz "Copy ctor called." pojaviti na ekranu ako izgradimo ovaj kod na kompajleru koji implementira C++14 i pokrenemo program? Nula, jedan ili možda dva puta? Točan odgovor: nepoznato.

Oni za koje je odgovor bio iznenađenje zaslužuju objašnjenje, na koje ćemo se sada osvrnuti. Dakle, za početak, otkrijmo standard i razmotrimo koji je ovdje maksimalan broj kopija Može biti biti stvoren. Najveći mogući broj kopija ovdje je broj 2: prva kopija se kreira kada se izvrši naredba return, a druga kopija se kreira kada se konstruira neki objekt. Ali ako pokrenete ovaj kod na više ili manje modernom kompajleru (bez dodatnih prekidača!), malo je vjerojatno da ćete vidjeti dvostruki izlaz; vjerojatniji ishod je ili jedan redak, ili nikakav izlaz. Sada ćemo malo modificirati kod naše funkcije, ovo će biti druga opcija:

SomeClass meReturn() ( SomeClass some(); return some; )

Ako izvršimo ovaj kod na popularnim kompajlerima, tada se izlaz može ili ne mora promijeniti (mijenja se na MSVC 2017, u načinu rada za otklanjanje pogrešaka). Konačno, još ćemo malo promijeniti kod funkcije, samo što se ovaj put izlaz zajamčeno mijenja (u odnosu na prvu opciju i uzimajući u obzir trenutno stanje stvari s prevoditeljima):

SomeClass meReturn() ( SomeClass some(); if (false) return SomeClass(); return some; )

Dakle, funkcija je u biti ista u svim varijantama, ali je ponašanje različito - što se ovdje uopće događa? Početi ispočetka. Prema C++ standardu, u nekim slučajevima prevodilac možda neće kopirati objekt; ova situacija se zove kopija preskoči(PC, engleski primjerak elision). Potpun (prilično kratak) popis značajki koje se mogu koristiti za određivanje je li preskakanje dopušteno opisan je u class.copy/p31. Zanimaju nas dvije slične, ali ipak različite situacije.

U izvornom primjeru, naša funkcija vraća privremeni bezimeni objekt. U takvoj situaciji prevoditelj može izostaviti obje kopije i jednostavno stvoriti objekt izravno u nekom . Ova situacija je popularno poznata kao optimizacija povratne vrijednosti(OVZ, eng. optimizacija povratne vrijednosti). Ako pogledamo gcc/clang/MSVC možemo vidjeti da se za takvu funkciju rješavaju obje kopije i stoga će izlaz biti prazan.

Ova optimizacija je dopuštena ne samo za return, već i za druga mjesta gdje se inicijalizacija događa s privremenim, neimenovanim objektom. Dakle, ako imate void meAccept(SomeClass) funkciju koja se zove kao meAccept(SomeClass()), tada kompajler može izostaviti suvišnu kopiju.

Sada prijeđimo na drugu opciju, gdje smo stvorili imenovani objekt na hrpi. Izlaz za gcc/clang se nije promijenio, ali za MSVC (u debug modu) pojavio se jedan redak u izlazu, očito je da se u ovom slučaju MSVC riješio samo druge kopije. Na temelju gore navedenog, postaje jasno da kompajler također koristi računalo, ali ovdje se to događa prema nešto drugačijem kriteriju: ima pravo riješiti se kopiranja imenovani objekt na stogu koji je vraćen iz funkcije. Ova optimizacija je popularno poznata kao imenovana optimizacija povratne vrijednosti(OIVZ, engleski naziv optimizacija povratne vrijednosti).

Kompajleru je ovu optimizaciju teže izvesti, što vidimo u trećoj opciji, gdje smo dodali apsolutno beskorisni if ​​, što je prisililo sva tri glavna prevoditelja da prođu i naprave kopiju. Stoga je OIV "krhkija" optimizacija od jednostavnog OIV-a i općenito je onemogućen kada postoji nekoliko različitih povrata u kodu. Ovo je jedan od argumenata zašto treba postojati samo jedan return u funkciji (ne mogu reći da je argument baš uvjerljiv).

Zanimljiva je činjenica da se gore navedene optimizacije primjenjuju u kompajlerima čak i kada prevodimo s onemogućenom optimizacijom (-O0, /Od). Štoviše, samo gcc i clang mogu biti prisiljeni napraviti sve kopije. Morate upotrijebiti preklopku -fno-elide-constructors da biste to učinili, a MSVC ni pod kojim okolnostima neće stvoriti dvije kopije, a nema [javnih] preklopnika za onemogućavanje ovakvog ponašanja.

Postoji još jedna stvar koju treba spomenuti. Iako u C++14 kompajler može ukloniti obje kopije, ne izvršavajući tako ni jednom konstruktor kopije, trebao bi izbaciti pogrešku kompilacije ako ne postoji takav konstruktor. Oni. ako ovo napišemo umjesto postojećeg konstruktora kopiranja: SomeClass(const SomeClass&) = brisanje, tada se program neće graditi čak ni kada se kompajleri sasvim legalno mogu osloboditi kopiranja - konstruktor i dalje mora biti.

I konačno, treća točka: kretanje. Ako prevoditelj može izostaviti kopiranje, može izostaviti i premještanje. Oni. u tom su pogledu apsolutno jednaki. S tim u vezi, inače, veže se jedna zanimljiva situacija. Mnogi programeri (o mnogima zaključujem na temelju koda koji sam vidio na netu) ne razumiju baš semantiku poteza i pišu kod sličan ovome: return std::move(someObject) . Naizgled, kod je apsolutno bezopasan i radi onako kako očekuje osoba koja ga je napisala, samo ovaj kod Zagarantiran isključuje OIVZ. Mislite li da je bolje napraviti jedan jeftini konstruktor poteza ili ne raditi ništa?

nova stvarnost

Sada je vrijeme da razmotrimo što se promijenilo u C++17 u vezi s računalom. Sve promjene o kojima ćemo raspravljati u ovom odjeljku dio su i mogu se pronaći u izvornom prijedlogu P0135R1. Ako pogledate ovaj dokument, vidjet ćete da opisuje brojne promjene standarda u smislu kategorije izraza (uglavnom vrijednost), kao i razna uređivanja koja pojašnjavaju gdje morate eksplicitno izvršiti direktno(izravno-) i kopiranje(copy-) inicijalizacija. Od cijelog ovog skupa, zanima nas samo jedna promjena, koja je opisana u stmt.return/p2.

Dakle, prema gornjoj inovaciji, vraćanje iz funkcije privremenog neimenovanog objekta (prvalue) istog tipa (tj. nije potrebna konverzija) kao tip povrata funkcije izvodi kopiranje-inicijalizaciju rezultata (što, prema dcl. init/p(17.6. 1) , omogućuje vam da preskočite kopiranje). Napisano u gornjoj rečenici je u biti ista HIA, samo ovaj put obavezna. Oni. ako je u C++14 prevoditelju mogao riješite se kopiranja/premještanja u takvom slučaju, sada to mora učini to. Što nam to daje, jer već smo vidjeli da sam kompilator odlično radi svoj posao? I daje nam sljedeće, s ovim kodom:

SomeClass meReturn() ( return SomeClass(); )

Ne možemo uopće imati konstruktore kopiranja i premještanja i svejedno će se kompilirati. Važno je napomenuti da se promijenio samo slučaj kada se drugi objekt kreira iz privremenog neimenovanog objekta, ali ako vratimo imenovani objekt (OIVZ), tada čak i ako prevodilac može preskočiti kopiranje, potrebna je prisutnost odgovarajućeg konstruktora .

Postoji još jedna stvar koja se već odnosi na prosljeđivanje argumenata, a ne na povratne vrijednosti. Ako imamo ovaj kod:

Void meAccept([] SomeClass s) ( )

Tada kod poziva funkcije meAccept(SomeClass()) također neće biti kopiranja, a to opet nije više optimizacija, već zahtjev standarda. To je zbog promjena u definiciji prvalue (basic.lval) i onoga što ta promjena podrazumijeva. Razdvojimo ovu liniju: meAccept(SomeClass()) . U smislu starog prvaluea, SomeClass() je privremeni objekt, koji se zatim kopira u parametar funkcije. Ali nova definicija prvalue je da to više nije objekt, Ali izraz, čija je evaluacija inicijalizacija objekta. Što to znači za nas? To znači da u izrazu koji razmatramo, SomeClass() nije privremeni objekt, već izraz za inicijalizaciju parametra funkcije. Ovdje je uključeno pravilo koje smo već spomenuli ranije opisano u dcl.init/p(17.6.1) i nema kopiranja - inicijalizacija se izvodi izravno.

Na prvi pogled, to je prilično beznačajna inovacija, jer se sve događalo na isti način, samo što prevoditelji nisu bili dužni to raditi. Međutim, ova je inovacija promijenila samu bit pojma prvalue, pa je ne treba smatrati beznačajnom. Da, i s čisto praktičnog gledišta, morate znati za ovu promjenu, jer kada učimo jezik, učimo ga empirijski, au tom procesu vrlo su česti eksperimenti s konstruktorima za kopiranje / premještanje. Dakle, počevši od C++17, ne postoji način na koji možete prisiliti kompajler da napravi kopiju u prethodno opisanim primjerima. Nikakve oznake neće pomoći ako je program kompajliran za C++17 i kompajler ga zapravo podržava. Što se tiče svakodnevnog koda, ova inovacija omogućuje stvaranje tvorničkih funkcija koje vraćaju objekte koji nemaju konstruktore za kopiranje/premještanje. Koliko je potrebno? Vrijeme će pokazati.

lambde

Odbor nastavlja pokazivati ​​svoju ljubav prema lambdama, dodajući im nešto novo u svakoj novoj reviziji standarda. Ni 2017. nije bila iznimka, a lambde su dobile svoju porciju inovacija. Iako stalno čekam kratku sintaksu (poput C# x => x ) i smatram da su inovacije ovog standarda male, još uvijek ih ne mogu zaobići.

Snimanje ovoga

Dakle, prva inovacija. Sada možete proslijediti kopiju objekta na popis za snimanje pomoću ovog pokazivača. Prije C++17, ako smo htjeli proslijediti kopiju trenutnog objekta lambda-i, bili smo prisiljeni napisati nešto poput ovoga:

#uključi korištenje imenskog prostora std; class SomeClass ( public: SomeClass(size_t value): m_Value(value) ( ​​​​) void someMethod() ( auto lambda = [_this = *this] ( for(size_t i = 0; i< _this.m_Value; ++i) cout << "This is lambda!!!\n"; }; lambda(); } private: size_t m_Value; }; int main() { SomeClass some{3}; some.someMethod(); };

Glavni nedostatak ovog pristupa je potreba da se eksplicitno navede naziv objekta u koji smo kopirali *this , svaki put kada mu se pristupi. C++17 ispravlja ovaj nedostatak dopuštajući vam da ovako pišete:

Auto lambda = [*this] ( for(size_t i = 0; i< m_Value; ++i) cout << "This is lambda!!!\n"; };

Oni. pristup članovima objekta provodi se na potpuno isti način kao da smo kreirali lambda s takvim popisom za snimanje, ali u ovom slučaju, ne trenutni objekt (tj. ovaj pokazivač), već njegova kopija se prosljeđuje lambda . Želio bih napomenuti da nisam morao pisati takav kod, pa mi je teško procijeniti korisnost inovacije, ali očito će nekome postati lakše živjeti. Mogu samo biti sretan zbog njih i prijeći na sljedeću inovaciju.

Treba više postojanosti!

Još jedna promjena koja se traži već duže vrijeme je dodavanje mogućnosti korištenja lambda u konstantnim izrazima. Naravno, i takve lambde moraju biti konstantne. Na primjer:

Automatski jedanaest = ( return 11; ); niz arr;

Kao što vidite, ništa se nije promijenilo u definiciji lambde, ali se njen poziv koristi u kontekstu u kojem je potrebna upotreba vremenske konstante prevođenja. Jer ovaj kod uspješno kompajlira, svaki pažljivi programer može zaključiti da je operator() klase generirane iz lambde član constexpr, a ovaj zaključak je bez sumnje točan. Od C++17, svi lambda izrazi su constexpr prema zadanim postavkama, dok su prije C++17 bili samo const. Ali oni će biti prebačeni u const ako tijelo lambda funkcije ne zadovoljava barem jedan od kriterija kojima se pokoravaju sve constexpr funkcije (kriteriji su opisani u dcl.constexpr). Napravimo minimalnu promjenu u našem kodu i lambda više neće biti constexpr:

Automatski jedanaest = ( int x; return 11; );

S takvom lambdom, kod za kreiranje niza će dati grešku kompilacije (što smo zapravo željeli), ali sama kreacija lambde neće dati grešku. Međutim, možemo zategnuti vijke i zahtijevati da lambda ima tijelo koje poštuje gore navedena pravila:

Automatski jedanaest = () constexpr ( int x; return 11; );

Imajte na umu da smo morali dodati i očiti constexpr i (), koji ne nosi nikakvo funkcionalno opterećenje i samo služi hirovima standarda. Dakle, možemo stvoriti lambda funkcije za koje je zajamčeno da će biti upotrebljive u constexpr kontekstu.

Ova promjena je odavno predložena i nikoga ne bi trebala iznenaditi: jednostavne funkcije mogu biti constexpr, funkcije članice također mogu biti, zašto su lambde gore? Koliko su potrebne constexpr lambda? Ovo je zanimljivije pitanje. Mislim da ih constexpr kod treba isto koliko i jednostavan kod. Trenutno postoji constexpr procvat u C++: ljudi se natječu tko može ići dalje u premještanju posla iz vremena izvođenja u vrijeme kompajliranja.

Oni idu sve do pisanja JSON parsera, pa čak i izvršavanja regularnih izraza (za one koje zanima, pogledajte video s CppCon2017: "Constexpr SVE stvari!"). Osim toga, sve više i više standardnih (i ne baš) algoritama postaje constexpr, što dovodi do najočiglednije upotrebe lambda, jer su jednostavno stvorene za algoritme. Stoga je, po mom mišljenju, dodavanje constexpr-a dobar korak naprijed, koji će vam omogućiti da napišete više koda koji će se izvršiti tijekom kompajliranja.

S druge strane, trebamo li se stvarno toliko kretati da bismo kompilirali vrijeme? Naravno, kada se nešto može prenijeti iz višestrukog dinamičkog izvođenja u jedno izvođenje u vrijeme prevođenja, to je definitivan plus. Ili ne? Ovisi o zadatku i koristima koje dobivamo tijekom izvršenja. Pretpostavimo da smo napisali JSON parser koji troši puno RAM-a i povećava vrijeme kompilacije (pogledajte barem zadnje 3 minute gornjeg videa), što nam to daje? Da, sada možemo analizirati konfiguraciju tijekom kompajliranja i koristiti je u kodu. Ali uostalom, mogli smo ovo učiniti i prije, bez upotrebe JSON-a, a to bi također bilo nulto opterećenje na vrijeme izvršenja (samo skup oznaka u zaglavlju, na primjer). Ovo me podsjeća na bradati vic:

Sreću se dva prijatelja:

— Čuo sam da ste kupili auto?

- Da! A kako je nekada živio! Sada mogu sve! Jučer sam uspio promijeniti ulje u jednom danu, kupiti nove gume, otišao u autopijacu po blatobrane, odmah u servis i promijenio ih, a odvezao sam se i u dućan po antifriz. Kako bih sve to mogao bez auta?

Može mi se prigovoriti da je JSON praktičniji. Neka bude. Zatim dodajmo skriptu u istom Pythonu (ili općenito CMakeu), koja će za nas generirati konfiguracijski objekt iz JSON-a. Da, morat ćemo dodati još jedan korak u izgradnji našeg projekta, ali je li to teže od pisanja C++ koda koji analizira JSON? I nitko nije otkazao vrijeme kompilacije (i mislim da je ovaj razlog puno značajniji): ako se kodu treba dugo kompilirati, razvoj će se pretvoriti u pakao. Tako da uopće ne vidim smisao u prijenosu složenih stvari na constexpr tračnice. Po mom mišljenju, ovo je nepotrebna komplikacija koja se može pokazati na konferencijama, ali je potpuno nepotrebna u stvarnom kodu. Korištenje izračuna vremena kompajliranja treba biti opravdano, ne samo zato što "možemo sada!".

Posljednja dva odlomka mogu dati pogrešnu predodžbu o mom stavu prema ovoj inovaciji: nisam protiv toga, samo sam protiv zakucavanja čavala mikroskopom, to je sve. Primjer potonjeg jasno je vidljiv u videu CppCona, no sama pojava constexpr lambda svakako je dobra vijest, jer se lambde funkcionalno ne bi trebale ni po čemu razlikovati od običnih funkcija – sve bi trebale imati iste mogućnosti, a ako moje pamćenje se ne mijenja, preostaje samo jedna stvar za dodati: imenovani parametri predloška za lambde. Čekamo li ih u C++20?

U svakoj neshvatljivoj situaciji, smirite se, lezite, zagrlite se, idite i jedite ukusne poslastice. Čuvajte svoje živce :)

Ostavite greške u prošlosti.

Cijenite ono pravo.

Nasmiješite se budućnosti

Čim otpustite situaciju koja vas muči, situacija će vas odmah pustiti.




Nemoj paničariti. Ne zna se što se može dogoditi u vašoj odsutnosti.

Dođi do drveta. Neka te nauči miru.

Koja je tajna vašeg duševnog mira?

"U potpunom prihvaćanju neizbježnog", odgovorio je Učitelj.

Dovedite stvari u red u svojim mislima - i vidjet ćete svijet drugim očima.

Ne zaboravite očistiti svoje srce.

Što je odmor?

Bez suvišnih misli.

A koje su misli nepotrebne?

(Wei Te-Han)

Vaše najvažnije blago je mir u vašoj duši.

Kamilica je umirujuća.

Upravljajte svojim raspoloženjem, jer ako ne sluša, onda zapovijeda.


Mir možete pronaći samo ako postanete promatrač, smireno promatrajući prolazan tok života. Irvin Yalom



Smirenost je jača od emocija.

Tišina je glasnija od vrištanja.

I što god da ti se dogodi, ne uzimaj ništa k srcu. Malo je na svijetu važno za dugo vremena.

Erich Maria Remarque "Trijemfalna kapija" ---

Kad vas uhvati kiša, iz ovoga možete izvući korisnu lekciju. Ako iznenada počne padati kiša, ne želite se pokisnuti, pa trčite niz ulicu do svoje kuće. Ali kada dođete kući, primijetite da ste još mokri. Ako od samog početka odlučite ne ubrzavati korak, pokisnut ćete, ali se nećete buniti. Isto treba učiniti u drugim sličnim okolnostima.

Yamamoto Tsunetomo - Hagakure. Knjiga o samuraju



Sutra će biti ono što treba biti

i neće biti ništa što ne bi trebalo biti -

ne nerviraj se.

Ako nema mira u nama, beskorisno ga je tražiti vani.

Neopterećen brigama -
uživa u životu.
Dobivanje nije sretno
gubitak ne tuguje, jer zna
ta sudbina nije trajna.
Kad nismo vezani stvarima
vedrina je potpuno poznata.
Ako se tijelo ne odmori od napetosti,
istroši se.
Ako je duh uvijek u brigama,
on blijedi.

Chuang Tzu ---

Ako bacite štap psu, on će pogledati ovaj štap. A ako lavu bacite štap, on će, ne podižući pogled, pogledati bacača. Ovo je formalna fraza koja se govorila tijekom sporova u drevnoj Kini, ako se sugovornik počeo držati riječi i prestao vidjeti glavnu stvar.

Kad udišem, smirujem tijelo i um.
Dok izdišem, smiješim se.
Budući da sam u sadašnjem trenutku, znam da je ovaj trenutak nevjerojatan!

Dopustite si da duboko udahnete i nemojte se dovoditi u okvire.

Snaga pripada onima koji vjeruju u svoju snagu.

Razvijte naviku praćenja svog mentalno-emocionalnog stanja kroz samopromatranje. Dobro je redovito se pitati: "Jesam li trenutno miran?" pitanje je koje si je korisno redovito postavljati. Također možete pitati: "Što se trenutno događa u meni?"

Eckhart Tolle

Sloboda je sloboda od briga. Shvaćajući da ne možete utjecati na rezultate, nemojte se obazirati na svoje želje i strahove. Neka dođu i odu. Nemojte ih hraniti sa zanimanjem i pažnjom. U stvarnosti se stvari rade s tobom, a ne s tobom.

Nisargadatta Maharaj


Što je osoba mirnija i uravnoteženija, to je njen potencijal moćniji i veći uspjeh u dobrim i vrijednim djelima. Staloženost uma jedno je od najvećih blaga mudrosti.


Osnova svake mudrosti je smirenost i strpljivost.

Prestanite brinuti i tada ćete vidjeti veličanstveni uzorak...

Kad se um odmori, počinjete cijeniti mjesečevu svjetlost i dah vjetra, i shvaćate da nema potrebe za svjetovnom strkom.

Nađi mir u svojoj duši i tisuće oko tebe bit će spašene.

Ono što stvarno želite je mir i ljubav. Izašao si iz njih, vratit ćeš im se i ti si oni. Papaji


Najljepši i najzdraviji ljudi su ljudi koje ništa ne živcira.


Najviši stupanj ljudske mudrosti je sposobnost da ostane miran unatoč vanjskim olujama.



Niste vezani svojim iskustvima, već prianjanjem za njih.

Ne donosite ishitrene odluke. Dobro odvažite sve prednosti i nedostatke. Gotovo svaka osoba ima nebeskog vodiča, drugo "ja". Razmislite i pitajte ga, isplati li se učiniti ono što ste planirali ili ne?! Naučite promatrati, vidjeti nevidljivo, predviđati situacije.

Kad razmišljate o planinskim šumama i potocima koji teku preko kamenja, srce zamagljeno svjetovnom prljavštinom postupno se čisti. Kad čitate drevne kanone i gledate slike drevnih majstora, duh svjetovne vulgarnosti malo po malo nestaje. Hong Zicheng, Okus korijena.


Mudrost dolazi sa sposobnošću da budemo smireni. Samo gledajte i slušajte. Ništa drugo nije potrebno. Kada ste u miru, kada samo gledate i slušate, to aktivira vašu inteligenciju bez pojma u vama. Neka mir vodi vaše riječi i djela.

Eckhart Tolle


Nikada ne možemo postići mir u vanjskom svijetu dok ga ne postignemo u unutarnjem.

Bit ravnoteže je ne držati se.

Bit opuštanja je ne suzdržavati se.

Bit prirodnosti je ne truditi se.

Ravnotežu je postigao onaj tko nije zavidan i nikome ne želi zlo. Za njega je cijeli svijet ispunjen srećom.

Kako bi život ponovno procvjetao, proključao i bio ispunjen uzbudljivom radošću i srećom, samo trebate stati... Zaustaviti se i dopustiti sebi da se otopite u užitku...

Ne brini za svoju budućnost, budi miran sada i sve će doći na svoje mjesto.

Ako se voda ne uzburka, sama će se istaložiti. Ako ogledalo nije prljavo, samo će reflektirati svjetlost. Ljudsko srce se ne može učiniti čistim voljom. Uklonite ono što ga zagađuje i njegova će se čistoća očitovati. Radost se ne može pronaći izvan sebe. Uklonite ono što vam stvara tjeskobu, i radost će sama zavladati u vašoj duši.


Nekad samo ostavi stvari na miru...

Uvijek je tiho u središtu uragana. Budite ono mirno mjesto u centru, čak i ako okolo bjesne vihori.

Ti si nebo. Sve ostalo je samo vrijeme.

Samo se u mirnim vodama stvari odražavaju neiskrivljeno.

Samo je smirena svijest prikladna za opažanje svijeta.

Kad ne znaš što učiniti, pričekaj malo. Budi tiho. Živi kako živiš. Znak će se pojaviti prije ili kasnije. Glavno je znati da čekaš i biti spreman dočekati ono što čekaš. Luis Rivera

Ne brini za svoju budućnost, budi miran sada i sve će doći na svoje mjesto.


Smirenost oduzima snagu vašim neprijateljima. U smirenosti nema ni straha ni pretjerane ljutnje - samo stvarnost, očišćena od iskrivljenja i smetnji emocionalnih ispada. Kad ste mirni, uistinu ste jaki.

Stoga će vas protivnici uvijek svim silama pokušavati izvući iz ovog stanja - potaknuti strah, posijati sumnje, izazvati bijes. Unutarnje stanje izravno je povezano s disanjem. U kakvoj god situaciji da se nađete, odmah smirite dah – duh će se smiriti sljedeći.


Najvažnija stvar u duhovnom životu je održati srce u miru.

Morate vjerovati životu.
Potrebno je bez straha povjeriti se njegovoj struji, jer život je beskrajno mudriji od nas.
I dalje se ponaša prema tebi na svoj način, ponekad prilično grubo,
ali na kraju ćeš shvatiti da je bila u pravu.

Budite sada mirni i sve će doći na svoje mjesto.

Ne smije se tvoj duh uznemiriti, zla riječ ne smije sići s tvojih usana; morate ostati dobronamjerni, sa srcem punim ljubavi, u kojem nema tajne zlobe; pa čak i zlonamjernike morate obaviti mislima punim ljubavi, velikodušnim mislima, dubokim i bezgraničnim, očišćenim od svakog bijesa i mržnje. Tako, moji učenici, morate postupiti.

Samo mirna voda ispravno odražava nebesa.

Najbolji pokazatelj razine svijesti je sposobnost mirnog odnosa prema životnim teškoćama.

Oni onesviještenu osobu vuku prema dolje, dok se ona pri svijesti diže sve više prema gore.

Eckhart Tolle.


Sjedi mirno i shvatit ćeš koliko su svakodnevne brige uzaludne. Ušuti malo i shvatit ćeš koliko su prazni svakodnevni govori. Odreknite se svakodnevnih nevolja i shvatit ćete koliko energije ljudi troše uzalud. Chen Jizhu.


Smirenost nam pomaže pronaći izlaz iz najtežih situacija.

Ponestalo vam je strpljenja? ... Napuhajte ponovno!)

3 TIHE SEKUNDE

Dovoljno je mirno razmisliti tri sekunde da sve shvatite.

Samo gdje ih nabaviti, ove stvarno tri mirne sekunde? Previše smo uzbuđeni vlastitim fantazijama da bismo stali čak i na trenutak.


Jeste li ikada vidjeli hrast u stanju stresa, dupina u mračnom raspoloženju, žabu s niskim samopouzdanjem, mačku koja se ne može opustiti ili pticu opterećenu ogorčenošću? Naučite od njih sposobnost podnošenja sadašnjosti.
Eckhart Tolle

Uzmite si vremena. Svaki se pupoljak otvara u svoje vrijeme. Ne prisiljavajte pupoljak da postane cvijet. Nemojte savijati latice. Oni su nježni; povrijedio si ih. Čekaj i oni će se sami otvoriti. Sri Sri Ravi Shankar

Ne obožavaj bradatog čovjeka na nebu ili idola u knjizi. Obožavajte udisaj i izdisaj, zimski povjetarac koji vam miluje lice, jutarnju gužvu u podzemnoj željeznici, samo osjećaj da ste živi, ​​nikad ne znajući što dolazi.Vidi Boga u očima stranca, Providnost u razorenom i običnom. Obožavajte zemlju na kojoj stojite. Neka vam svaki dan bude ples, sa suzama u očima, kontemplirajući božansko u svakom trenutku, uočite apsolut u svemu relativnom i dopustite da vas ljudi nazivaju ludim. Neka se smiju i šale.

Jeff Foster

Viša moć nije sposobnost poraziti druge, već sposobnost postati jedno s drugima.

Sri Chinmoy

Pokušajte, barem u maloj mjeri, ne dovesti svoju pamet.
Pogledaj svijet - samo pogledaj.
Nemojte reći "sviđa mi se" ili "ne sviđa mi se". Ne govori ništa.
Ne izgovaraj riječi, samo gledaj.
Um će se osjećati nelagodno.
Moj um bi želio nešto reći.
Samo kažeš umu:
"Tiši, da vidim, samo ću gledati"...

6 mudrih savjeta Chen Jirua

1. Sjedi mirno i shvatit ćeš kako su uzaludne svakodnevne brige.
2. Ušuti malo i shvatit ćeš koliko su prazni svakodnevni govori.
3. Odreknite se svakodnevnih nevolja i shvatit ćete koliko ljudi uzalud troše energije.
4. Zatvorite svoja vrata, i shvatit ćete koliko su opterećujuće veze poznanstva.
5. Imaj malo želja, i shvatit ćeš zašto su bolesti ljudskog roda toliko brojne.
6. Budi humaniji, pa ćeš shvatiti koliko su obični ljudi bezdušni.

Oslobodite svoj um od misli.
Neka ti se srce smiri.
Mirno prati nemir svijeta
Gledajte kako sve dolazi na svoje mjesto...

Sretnu osobu vrlo je lako prepoznati. Čini se da zrači aurom smirenosti i topline, kreće se sporo, ali stiže sve, govori smireno, ali ga svi razumiju. Tajna sretnih ljudi je jednostavna – to je odsutnost napetosti.

Ako sjedite negdje na Himalaji i tišina vas okružuje, to je tišina Himalaje, a ne vaša. Morate pronaći vlastite Himalaje unutar...

Misaonim ranama treba dulje da zacijele nego bilo kojim drugim.

JK Rowling, "Harry Potter i Red feniksa"

Mudrost dolazi sa sposobnošću da budemo smireni.Samo gledajte i slušajte. Ništa drugo nije potrebno. Kada ste u miru, kada samo gledate i slušate, to aktivira vašu inteligenciju bez pojma u vama. Neka mir vodi vaše riječi i djela.

Eckhart Tolle "Što tišina govori"

Što je osoba mirnija i uravnoteženija, to je njen potencijal moćniji i veći uspjeh u dobrim i vrijednim djelima. Staloženost uma jedno je od najvećih blaga mudrosti.

James Allen

Kada živite u skladu sa samim sobom, možete se slagati s drugima.

Istočna mudrost -

Sjediš - i sam sjediš; ti idi - i idi sam.
Glavna stvar - ne bunite se uzalud.

Promijenite svoj odnos prema stvarima koje vam smetaju i bit ćete sigurni od njih. (Marko Aurelije)

Obratite pažnju na solarni pleksus. Pokušajte zamisliti da mala solarna kugla svijetli u vama. Neka se rasplamsa, postane veća i jača. Neka vas njegove zrake obasjaju. Neka sunce obasja cijelo vaše tijelo svojim zrakama.

Harmonija je ravnomjernost u svemu. Želite li napraviti frku, brojite do 10 i “nakrenite” sunce.

Mirno, samo mirno :)

Budite zainteresirani za ono što se događa u vama, ništa manje nego za ono što vas okružuje. Ako je sve u redu u unutarnjem svijetu, onda će sve doći na svoje mjesto u vanjskom svijetu.

Eckhart Tolle ---

Budala i neznalica imaju pet znakova:
ljut bez razloga
govoriti nepotrebno
promijeniti bez razloga
miješaju se u stvari koje ih se uopće ne tiču,
i ne znaju razlikovati tko im želi dobro, a tko - zlo.

Indijska poslovica ---

Što ide, neka ide.
Što dođe, nek dođe.
Nemaš ništa i nikad nisi imao, osim sebe.

Kad biste samo mogli zadržati unutarnju tišinu nezagađenu sjećanjima i očekivanjima, mogli biste vidjeti prekrasan obrazac događaja. Vaša je tjeskoba ta koja stvara kaos.

Nisargadatta Maharaj ---

Postoji samo jedan put do sreće, a to je da prestanemo brinuti o stvarima koje su izvan naše volje.

Epiktet ---

Kad izgubimo osjećaj vlastite važnosti, postajemo neranjivi.

Da bi bio jak, moraš biti kao voda. Nema prepreka - teče; brana - prestat će; brana pukne - opet će teći; u četverokutnoj posudi je četverokutan; u krugu - okruglo je. Budući da je tako popustljiv, najpotrebniji je i najjači od svih.

Svijet je poput željezničke stanice, gdje uvijek čekamo, a zatim žurimo.

Kada se vaš um i osjetila uspore prema otkucajima Srca, spontano ulazite u sklad s kozmičkim ritmom. Počinjete promatrati svijet božanskim očima, promatrajući kako se sve događa samo od sebe iu svoje vrijeme. Otkrivajući da je sve već usklađeno sa zakonom svemira, dolazite do shvaćanja da se ne razlikujete od svijeta i njegova Gospodara. Ovo je Sloboda. Mooji

Previše patimo. Shvaćamo to preozbiljno. Sve bi trebalo biti lakše. Ali mudro. Bez živaca. Glavno je misliti. I nemoj raditi gluposti.

Ono što možeš mirno prihvatiti više te ne kontrolira...

Nigdje se ne može naći mir za one koji ga nisu našli u sebi.

Biti ljut i iznerviran nije ništa drugo nego kažnjavati sebe zbog tuđe gluposti.

Ti si nebo. A oblaci su ono što se događa, dolazi i odlazi.

Eckhart Tolle

Živite u miru. Dođe proljeće, a cvijeće samo procvjeta.


Poznato je da što osoba izgleda smirenije, to joj drugi ljudi rjeđe proturječe i svađaju se s njom. Nasuprot tome, ako osoba žestoko brani svoje stajalište, nailazi na svađu i žestok otpor.

Ne žuri. Jedite u čas jela, i doći će čas puta- kreni na put.

Paulo Coelho "Alkemičar"

Popustiti znači prihvatiti ono što jest. Dakle, otvoreni ste životu. Otpor je unutarnja stezaljka... . Dakle, potpuno ste zatvoreni. Što god učinili u stanju unutarnjeg otpora (koji se može nazvati i negativnošću), to će izazvati još veći vanjski otpor, a svemir neće biti na vašoj strani, život vam neće pomoći. Svjetlost ne može ući kroz zatvorene kapke. Kada iznutra popustite i prestanete se boriti, otvara se nova dimenzija svijesti. Ako je djelovanje moguće... bit će učinjeno... podržano kreativnim umom... s kojim, u stanju unutarnje otvorenosti, postajete jedno. A onda vam okolnosti i ljudi počnu pomagati, postati jedno s vama. Postoje sretne slučajnosti. Sve vam ide u prilog. Ako djelovanje nije moguće, vi ste u miru i unutarnjem miru koji dolazi s neborbom.

Eckhart Tolle Nova Zemlja

Poruka "Smiri se". dosadan iz nekog razloga uvijek više.Još jedan paradoks.Obično nakon takvog pozivanikome ne pada na pamet da se smiri.

Bernard Werber Cassandrino ogledalo

Tko se ponizio, pobijedio je neprijatelje.

Siluan Atonski

Smiren je onaj koji Boga čuva u sebi.


Kada se svađate s budalom, on najvjerojatnije radi istu stvar.

Prava snaga čovjeka nije u porivima, već u neuništivoj smirenosti.

Najviši stupanj ljudske mudrosti je sposobnost prilagođavanja okolnostima i zadržavanja smirenosti unatoč vanjskim olujama.

Ometajući osjećaji i misli nestat će ako ne obratite pažnju na njih. Lama Ole Nidal

Nikada nećete požaliti ono što ste uspjeli prešutjeti.
--- istočnjačka mudrost ---

Vrijedno je težiti takvom stanju svijesti u kojem će se svi događaji percipirati neutralno.

Smirenost i red, opći duševni mir – to su željena stanja svake osobe. Život nam uglavnom prolazi kao na ljuljački - od negativnih emocija do euforije i obrnuto.

Kako pronaći i održati točku ravnoteže tako da se svijet doživljava pozitivno i mirno, da ništa ne iritira i ne plaši, a sadašnji trenutak donosi inspiraciju i radost? I je li moguće pronaći dugoročni duševni mir? Da, moguće je! Štoviše, uz mir dolazi prava sloboda i jednostavna sreća življenja.

Ovo su jednostavna pravila i djeluju religiozno. Samo trebate prestati razmišljati KAKO se promijeniti i početi ih PRIMJENJIVATI.

1. Prestanite se pitati "Zašto mi se to dogodilo?" Postavite si još jedno pitanje: “Što se divno dogodilo? Kakvu korist ovo može učiniti za mene?” Dobro je tu, samo ga treba vidjeti. Svaki problem može se pretvoriti u pravi dar odozgo, ako ga smatrate prilikom, a ne kaznom ili nepravdom.

2. Vježbajte zahvalnost. Svaku večer sumirajte: za ono što možete reći "hvala" danu koji ste proživjeli. Ako izgubite duševni mir, sjetite se dobrih stvari koje imate i stvari na kojima možete biti zahvalni u životu.

3. Opteretiti tijelo fizičkim vježbama. Zapamtite da mozak najaktivnije proizvodi "hormone sreće" (endorfine i enkefaline) tijekom tjelesnog treninga. Stoga, ako vas svladaju problemi, tjeskoba, nesanica - izađite van i šetajte nekoliko sati. Brz korak ili trčanje odvratit će pažnju od tužnih misli, zasititi mozak kisikom i podići razinu pozitivnih hormona.

4. Razvijte "veselo držanje" i stvorite sretno držanje za sebe. Tijelo vam može izvrsno pomoći kada trebate vratiti duševni mir. Ono će “zapamtiti” osjećaj radosti ako samo ispravite leđa, ispravite ramena, sretno se protegnete i nasmiješite. Svjesno se neko vrijeme zadržite u ovom položaju i vidjet ćete da će vam misli u glavi postati smirenije, sigurnije i sretnije.

5. Vratite se ovdje i sada. Jednostavna vježba pomaže da se riješite tjeskobe: pogledajte oko sebe, usredotočite se na ono što vidite. Počnite mentalno "izgovarati" sliku, ubacujući što više riječi "sada" i "ovdje". Na primjer: “Sada hodam ulicom, ovdje sija sunce. Sada vidim čovjeka, nosi žuto cvijeće…” i tako dalje. Život se sastoji samo od trenutaka "sada", ne zaboravi to.

6. Ne preuveličavajte svoje probleme. Uostalom, čak i ako muhu približite očima, poprimit će veličinu slona! Ako vam se neko iskustvo čini nepremostivim, razmislite kao da je već prošlo deset godina... Koliko je problema bilo prije - sve ste ih riješili. Stoga će i ova nevolja proći, ne ronite u nju s glavom!

7. Više se smijte. Pokušajte pronaći nešto smiješno u trenutnom stanju stvari. Ne ide – onda samo nađite razlog za iskreni smijeh. Pogledajte smiješan film, sjetite se smiješnog događaja. Moć smijeha je nevjerojatna! Duševni mir se često vraća nakon dobre doze humora.

8. Opraštajte više. Ogorčenost je poput teškog, smrdljivog kamenja koje nosite sa sobom. Kakav mir može biti s takvim teretom? Stoga, ne držite zlo. Ljudi su samo ljudi, ne mogu biti savršeni i uvijek donose samo dobro. Zato oprostite uvrijediteljima i oprostite sebi.

10. Više komunicirajte. Svaka bol skrivena u sebi množi se i donosi nove tužne plodove. Stoga podijelite svoja iskustva, razgovarajte o njima s voljenima, potražite njihovu podršku. Upamtite da čovjeku nije suđeno da bude sam. Duševni mir može se pronaći samo u bliskim odnosima – prijateljskim, ljubavnim, obiteljskim.

11. Molite i meditirajte. Ne dopustite da vas kontroliraju loše zle misli, da siju paniku, bol i iritaciju. Promijenite ih u kratke molitve - apel Bogu ili u meditaciju - stanje nerazmišljanja. Zaustavite neposlušni tok internog razgovora. To je osnova dobrog i stabilnog stanja uma.