Archive

Posts Tagged ‘rvalue’

Досконала переадресація

Загальна форма проблеми переадресації має такий вигляд:

Для заданого виразу E(a1, a2, ..., an), що залежить від (шаблонних) параметрів a1, a2, ..., an, написати функцію (об’єкт) f такий, що виклик f(a1, a2, ..., an) тотожний виклику E(a1, a2, ..., an).

Стандарт C++11 уможливив створення таких функцій (об’єктів) завдяки rvalue посиланням.

Розглянемо просту функцію-фабрику:

template<typename T, typename Arg> 
shared_ptr<T> factory(Arg arg)
{ 
  return shared_ptr<T>(new T(arg));
}

Читати далі…

Категорії:C++ Позначки:, ,

Прагнеш швидкості? Передавай за значенням.

Тільки чесно: які почуття викликає в вас наступний код?

std::vector<std::string> get_names();
...
std::vector<std::string> const names = get_names();

Відверто, я б занервував. В принципі, по завершені get_names() ми маємо копіювати вектор рядків. Потім ми маємо копіювати його знов, коли ініціалізуємо names, і маємо знищити першу копію. Якщо в векторі N рядків, кожне копіювання може вимагати аж по N+1 виділень пам’яті і безліч недружнього щодо кешу доступу до даних, коли вміст рядка копіюється.

Радше ніж відчувати цю тривогу, я часто повертався до використання передачі за посиланням, щоб уникнути непотрібних копій:

get_names(std::vector<std::string>& out_param );
...
std::vector<std::string> names;
get_names( names );

На жаль, цей підхід далекий від досконалості.

  • Об’єм коду виріс на 150%
  • Нам довелось поступитись сталістю, бо ми змінюємо names.
  • Як функційні програмісти захочуть нам нагадати, зміна параметра ускладнює розуміння через підривання прозорості посилань і міркувань щодо рівнянь (equational reasoning.).
  • Ми більше не дотримуємось суворої семантики передачі за значенням для names.

Але, чи дійсно конче необхідно так плутати наш код для досягнення дієвості? На щастя, виявляється, що відповідь ні (особливо, якщо ви використовуєте C++0x). Ця стаття перша в серії, що досліджує п-значення (rvalues) та їх вплив на дієвість семантики значень (value semantics) в C++.

Читати далі…

Категорії:Перекладені Позначки:,

Rvalue посилання: C++0x можливості в VC10

л- та п-значення в C++98/03

Для розуміння правосторонніх посилань (rvalue reference) в C++0x, ви маєте розуміти лівосторонні й правосторонні значення в C++98/03.

Терміни ‘л-значення’ та ‘п-значення’ викликають плутанину, це пов’язано з їхньою історією. Ці поняття прийшли з С і тоді стали частиною C++. Для збереження часу, ми проминемо їхню історію, включно з причинами чому вони називаються ‘л-значення’ та ‘п-значення’ й одразу розглянемо як вони працюють в C++98/03. (Добре, це не велика таємниця, що ‘Л’ означає ‘лівий’, а ‘R’ – ‘правий’. Але самі поняття розвинулись і змінились, і тепер їхні назви не дуже точні. Замість прослуховування уроку з історії їх появи, ви можете уявити, що вони мають довільні назви, приміром, ‘верхня частка’ та ‘нижня частка’, і при цьому ви нічого не втратите.)

C++03 3.10/1 каже: ‘Кожен вираз є або л-значенням або п-значенням.’ Важливо пам’ятати, що л- або п-значеннєвість це властивість виразу, а не об’єкта.
Читати далі…

Категорії:Uncategorized Позначки:,