Вопросы по теме 'copy-elision'
прохождение тяжелых объектов C++0x
У меня есть функция, которая создает тип дорогого объекта (содержащего векторы и карты нефиксированного размера), поэтому я действительно хочу избежать вызова копирования c'tors.
До сих пор я только что возвращал std::shared_ptr из метода и...
488 просмотров
schedule
30.07.2022
Передача по значению и оптимизация исключения копирования
Я наткнулся на статью http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
Совет автора:
Не копируйте аргументы вашей функции. Вместо этого передайте их по значению и позвольте компилятору сделать копирование.
Однако я не...
1745 просмотров
schedule
07.06.2023
Конструктор копирования не вызывается при инициализации объекта с возвращаемым значением функции
Рассмотрим следующий код:
#include <iostream>
using namespace std;
class A
{
public:
int a;
A(): a(5)
{
cout << "Constructor\n";
}
A(const A &b)
{
a =...
782 просмотров
schedule
04.09.2022
Как избежать перемещения при передаче временного значения по значению?
В следующем коде:
Widget makeWidget()
{
return Widget();
}
void foo(Widget widget)
{
...
}
foo(makeWidget());
объект Widget всегда будет создаваться на месте (внутри функции foo), поэтому не происходит построения перемещения (по...
441 просмотров
schedule
10.11.2022
Move Constructor vs Copy Elision. Какой из них вызывается?
У меня есть два фрагмента кода, чтобы показать вам. Это два класса, каждый из которых предоставляет конструктор перемещения и функцию, которая возвращает временное значение.
В первом случае функция, возвращающая временное значение, вызывает...
3111 просмотров
schedule
13.03.2022
Как работает гарантированное копирование?
На встрече по стандартам ISO C ++ в Оулу в 2016 г. было внесено предложение под названием Гарантированное копирование с помощью упрощенных категорий значений было одобрено комитетом по стандартам C ++ 17.
Как именно работает гарантированное...
13567 просмотров
schedule
07.12.2023
Запрещает ли C ++ 17 исключение копирования в случае, если это разрешено в C ++ 14?
Учтите следующее:
struct X {
X() {}
X(X&&) { puts("move"); }
};
X x = X();
В C ++ 14 перемещение можно было опустить, несмотря на то, что конструктор перемещения имеет побочные эффекты благодаря [class.copy] / 31,
Это...
479 просмотров
schedule
09.07.2022
Зависит ли поведение гарантированного исключения копирования от существования определяемого пользователем конструктора копирования?
Следующий код ведет себя по-разному с пользовательским конструктором копирования или без него в GCC 8.0.1 :
#include <cassert>
struct S {
int i;
int *p;
S() : i(0), p(&i) {}
// S(const S &s) : i(s.i), p(&i) {}...
801 просмотров
schedule
30.03.2022
Исключение копирования/перемещения требует явного определения конструкторов копирования/перемещения.
Рассмотрим следующую программу:
#include <iostream>
#include <utility>
class T {
public:
T() { printf("address at construction: %zx\n", (uintptr_t)this); }
// T(const T&) { printf("copy-constructed\n"); } // helps...
252 просмотров
schedule
14.08.2023
Const-корректность для нетривиальных переменных
(отчасти вдохновленный этим ответом , хотя и не связанным)
Мне всегда говорили (и я говорил), что сохранение const -правильности даже для недолговечных переменных является ценным и хорошей практикой, например:
const std::string a = "Hello...
178 просмотров
schedule
20.09.2022
Требуется ли конструктор/назначение перемещения для запуска RVO в С++ 11?
Например:
В принятом ответе https://stackoverflow.com/a/14623480/1423254
Будет ли копирование elision и RVO по-прежнему работать для классов без конструкторов перемещения?
Да, RVO все еще срабатывает. На самом деле ожидается, что компилятор...
95 просмотров
schedule
20.09.2023
Предотвращение ненужного копирования между большими структурами
У меня есть огромные структуры DataFrom и Data (которые на самом деле имеют разные члены). Данные создаются из DataFrom.
struct DataFrom{
int a = 1;
int b = 2;
};
static DataFrom dataFrom;
struct Data{
int a;
int b;
};
class...
100 просмотров
schedule
07.11.2022
MSVC не может вернуть объект, который можно скопировать, но нельзя переместить
Когда я возился с copy elision, я столкнулся со странным поведением:
class Obj {
public:
Obj() = default;
Obj(Obj&&) = delete;
Obj(const Obj&) { std::cout << "Copy" << std::endl; }
};
Obj f1() {
Obj o;...
901 просмотров
schedule
18.04.2022