Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lvalue и rvalue - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как сделать проверку нажатия по спрайту хаотичной формы? http://www.cyberforum.ru/cpp/thread1772858.html
Игра в изометрии на SDL , и встаёт вопрос как сделать проверку нажатия(мышкой) на объект (например кровать) и совершить действия при нажатии(например спать)
C++ Нужна программа для перехвата клика мыши Стоит задача: Когда я нажимаю ЛКМ нужно, чтобы программа перехватила это нажатие, и нажала лишь когда истечет определенное кол-во времени. pseudo_code: if(GetAsyncKeyState(0x01)) { перехват мыши;... http://www.cyberforum.ru/cpp/thread1772607.html
Неявные интерфейсы С++ шаблонов. Сложно о простом C++
Неявные интерфейсы С++ шаблонов. Сложно о простом. Вот заметка в формате PDF о том, как использовать типизацию для параметров шаблонов. Отдельные утверждения из заметки процитирую, не влезет...
C++ Как написать браузер под Windows?
Здравствуйте. Подскажите пожалуйста, как можно написать браузер на C++? Можно не с нуля. Может ли это сделать человек, без особой практики C++, но знающий его основы? Требуется написать браузер...
C++ Рекурсивные функции. Разделение эл. массива, пока не останется 1 элемент http://www.cyberforum.ru/cpp/thread1771720.html
Вся суть в том что нужно взять массив из 10 элементом и разделить его на пополам (например от 1 до 5 и от 6 до 10) потом левую часть которая (от 1 до 5) снова разделить на 2 части (например, от 1 до...
C++ Не могу скомпилировать сорс с github Скачал отсюда https://github.com/AmirAfendin/SPM исходник, но скомпилировать его никак не получается. Кто разбирается помогите. P.S. там надо заменить 1 строку, что бы заработала, но разработчик... подробнее

Показать сообщение отдельно
ASCII
90 / 63 / 10
Регистрация: 15.12.2013
Сообщений: 407
Завершенные тесты: 2
18.07.2016, 02:53
elch10,
C++
1
2
3
4
5
6
7
8
int main()
{
* * A a;
* * std::string name{"another name"};
* * a.setName("New name"); // не №1, а №2
* * a.setName(name); // не №2, а №1
* * return 0;
}
1) При передаче строки "New name", мы провоцируем создание временного объекта (на практике это не всегда так), которое классифицируется как rvalue
2) Выражение name - это идентификатор объекта, а любой идентификатор объекта, это lvalue выражение

http://rextester.com/BTUZU14864

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <chrono>
 
class Example
{
public:
 
    // default ctor
    Example() : pointer_{::new int[100500]} { }
 
    // copy ctor
    Example(Example const& other) : pointer_{::new int[100500]}
    {
        // в данном примере, лучше юзать std::memcpy, т.к. это интринсик
        // но на месте int, может быть любой другой класс
        // внимание тут надо акцентировать на том, что тут происходит копия
 
        for(std::size_t i = 0; i < 100500; ++i)
        {
            pointer_[i] = other.pointer_[i];
        }
    }
 
    // move ctor
    Example(Example&& other) : pointer_{other.pointer_}
    {
        // а тут надо акцентировать внимание на следующем:
        // 1) раз вызывается конструктор перемещения, значит переданный объект
        // является временным, в большинстве случаев (может быть и не временным, если вызвать std::move)
        // 2) значит мы можем просто забрать указатель на хранимые в нем данные и пропустить копирование
 
        other.pointer_ = nullptr;
    }
 
    ~Example() { ::delete pointer_; }
 
private:
    int* pointer_;
};
 
void call_copy_ctor(Example ex)
{
    // просто, чтобы заглушить warning от компилятора
    (void)ex;
 
    /* создается объект ex, с помощью копирования, затем уничтожается, исходный объект не портится */
}
 
void call_move_ctor(Example&& ex)
{
    // просто, чтобы заглушить warning от компилятора
    (void)ex;
 
    /* создается объект ex, с помощью перемещения, затем уничтожается, исходный объект обнуляется */
}
 
int main()
{
    Example arr[1000];
 
    auto start = std::chrono::high_resolution_clock::now();
    for(std::size_t i = 0; i < 1000; ++i)
    {
        call_copy_ctor(arr[i]);
    }
    auto end = std::chrono::high_resolution_clock::now();
 
    std::cout << "Time for copy: ";
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
    std::cout << " nanoseconds." << std::endl;
 
    start = std::chrono::high_resolution_clock::now();
    for(std::size_t i = 0; i < 1000; ++i)
    {
        call_move_ctor(std::move(arr[i]));
    }
    end = std::chrono::high_resolution_clock::now();
 
    std::cout << "Time for move: ";
    std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();
    std::cout << " nanoseconds." << std::endl;
 
    return 0;
}
То есть rvalue ссылки, благодаря тому, какие объекты они описывают, позволяют создавать конструкторы перемещения, которые, исходя из того, что объект rvalue (то есть временный), просто забирает указатель на данные, без копирования, а это сильно снижает нагрузку. Взгляните на время выполнения копирования и на время выполнения перемещения http://rextester.com/UXAEG92502
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru