From 8cf1283a4ffb9fe1901c29c087fa376de82726af Mon Sep 17 00:00:00 2001 From: angeld55 Date: Sat, 19 Feb 2022 23:30:52 +0200 Subject: clean up --- Sem. 11/README.md | 129 ------------------------------------------------------ 1 file changed, 129 deletions(-) delete mode 100644 Sem. 11/README.md (limited to 'Sem. 11/README.md') diff --git a/Sem. 11/README.md b/Sem. 11/README.md deleted file mode 100644 index 485b956..0000000 --- a/Sem. 11/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# Move семантики -#### Подаване на стойност по референция -```c++ -#include -using namespace std; - -void f(int& n) -{ - cout << n << endl; -} -int main() -{ - int number = 10; - f(number); // OK! - f(3); // Error! -} - ``` -"Висящата" константа 3 **няма адрес в паметта**. За това подаването и като параметър на функцията f ще доведе до компилационна грешка. - -**&&** - за стойности без адрес в паметта -```c++ -#include -using namespace std; - -void f(int& n) -{ - cout << n << endl; -} -int main() -{ - int number = 10; - f(number); // OK! - f(3); // Error! -} - ``` - -#### Пример за използването на && -```c++ -#include -using namespace std; - -void f(int&& n) -{ - cout << n << endl; -} -int main() -{ - int number = 10; - f(number); // Error! - f(3); // OK! -} - ``` -Тук грешката възниква при подаването на променлива, която **има адрес в паметта.** -#### lvalue и rvalue - - - **lvalue** - обект, който заема някакво конкретно място в паметта. (стойността в паметта може да се модифицира) - - **rvalue** - обект, който не е *lvalue* . - - -#### Излишни копия? -Да разгледаме следният програмен фрагмент: - -```c++ -#include -#include -#include "Person.h" -using namespace std; - -Person createPerson(const char* name, int age) -{ - Person p(name, age); - - return p; -} - -int main() -{ - Person p2("Petur",18); - p2 = createPerson("Ivan", 23); -} - ``` -Тук се изпълняват следните функции на Person: - - 1. Конструктор на Person (за p2) - 2. Конструктор за Person (на p). - 3. Копиращ конструктор (за *return p*) - 4. Деструктор (в края на функцията *createPerson*) - 5. Оператор = (за *p2 = create...* ) - 6. Деструктор (в края на функцията *main*) - -Проблемът тук е, че правим излишни копия. Обектът създаден в *createPerson* **се копира два пъти докато се присвои** на p2. -#### Move конструктор и move оператор =. -За да избегнем излишните копия, може да "преместим" данните на обектът, който се създава във функцията, в данните на p2. -```c++ - -//Move constructor -Person::Person(Person&& rhs) -{ - name = rhs.name; - age = rhs.age; - - rhs.name = nullptr; -} - -//Move operator= -Person& Person::operator=(Person&& rhs) -{ - if (this != &rhs) - { - free(); - - name = rhs.name; - rhs.name = nullptr; - } - return *this; -} - ``` - - Важно е да се обърне внимание, че тук данните **не се копират**, а се **местят**. Т.е приемаме, че rhs **няма да се използва след изпълнението на функцията.** - Сега при изпълнението на първоначално разгледания код: - 1. Конструктор на Person (за p2) - 2. Конструктор за Person (на p). - 3. **Move конструктор** (за *return p*) - 4. Деструктор (в края на функцията *createPerson*) - 5. **Move oператор =** (за *p2 = create...* ) - 6. Деструктор (в края на функцията *main*) - - -Т.е тук си спестихме 2 копия за динамичната памет в Person. -- cgit v1.3.1-23-gd82d