vector — это структура с двумя открытыми членами X и Y; параметризованный конструктор, который печатает целочисленный конструктор с именем; конструктор копирования, который печатает конструктор копирования, называемый; и конструктор перемещения, который печатает конструктор перемещения, называемый.
Функция makeVectorx5y5IfNotZero() возвращает вектор {5, 5}, если arg равен 0. в противном случае она возвращает {2, 2.
Функция main создает вектор A с помощью makeVectorx5y5IfNotZero(1) и создает вектор B с помощью makeVectorx5y5IfNotZero(0).
Вот код:
#include
struct vector{
int X, Y;
vector(int X, int Y) : X(X), Y(Y){
printf("integer constructor called\n");
}
vector(const vector& other): X(other.X), Y(other.Y){
printf("copy constructor called\n");
}
vector(vector&& other): X(other.X), Y(other.Y){
printf("move constructor called\n");
}
};
vector makeVectorx5y5IfNotZero(bool Arg){
if(Arg){
vector A(0, 0);
A.X = 5;
A.Y = 5;
return A;
}
else {
vector B(1,1);
B.X = 2;
B.Y = 2;
return B;
}
}
int main(){
printf("Making Vector\n");
vector A = makeVectorx5y5IfNotZero(1);
printf("Made Vector\n");
printf("Making Another Vector\n");
vector B = makeVectorx5y5IfNotZero(0);
printf("Made Vector\n");
}
Вывод этого кода:
Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
move constructor called
Made Vector
Однако из-за NRVO я ожидал следующего результата:
Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
Made Vector
Почему локальная переменная B функции makeVectorx5y5IfNotZero() перемещается в локальную переменную B функции main(), а не чем просто создать одну переменную по одному и тому же адресу памяти?
Версия компилятора (выходные данные g++ --version):
g++ (Rev3, Built by MSYS2 project) 14.1.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Подробнее здесь: https://stackoverflow.com/questions/792 ... same-funct
Почему один вызов этой функции использует NRVO, а другой вызов той же функции — нет? ⇐ C++
Программы на C++. Форум разработчиков
1734161602
Anonymous
vector — это структура с двумя открытыми членами X и Y; параметризованный конструктор, который печатает целочисленный конструктор с именем; конструктор копирования, который печатает конструктор копирования, называемый; и конструктор перемещения, который печатает конструктор перемещения, называемый.
Функция makeVectorx5y5IfNotZero() возвращает вектор {5, 5}, если arg равен 0. в противном случае она возвращает {2, 2.
Функция main создает вектор A с помощью makeVectorx5y5IfNotZero(1) и создает вектор B с помощью makeVectorx5y5IfNotZero(0).
Вот код:
#include
struct vector{
int X, Y;
vector(int X, int Y) : X(X), Y(Y){
printf("integer constructor called\n");
}
vector(const vector& other): X(other.X), Y(other.Y){
printf("copy constructor called\n");
}
vector(vector&& other): X(other.X), Y(other.Y){
printf("move constructor called\n");
}
};
vector makeVectorx5y5IfNotZero(bool Arg){
if(Arg){
vector A(0, 0);
A.X = 5;
A.Y = 5;
return A;
}
else {
vector B(1,1);
B.X = 2;
B.Y = 2;
return B;
}
}
int main(){
printf("Making Vector\n");
vector A = makeVectorx5y5IfNotZero(1);
printf("Made Vector\n");
printf("Making Another Vector\n");
vector B = makeVectorx5y5IfNotZero(0);
printf("Made Vector\n");
}
Вывод этого кода:
Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
move constructor called
Made Vector
Однако из-за NRVO я ожидал следующего результата:
Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
Made Vector
Почему локальная переменная B функции makeVectorx5y5IfNotZero() перемещается в локальную переменную B функции main(), а не чем просто создать одну переменную по одному и тому же адресу памяти?
Версия компилятора (выходные данные g++ --version):
g++ (Rev3, Built by MSYS2 project) 14.1.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Подробнее здесь: [url]https://stackoverflow.com/questions/79279359/why-does-one-call-of-this-function-use-nrvo-while-another-call-of-the-same-funct[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия