Почему один вызов этой функции использует NRVO, а другой вызов той же функции — нетC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему один вызов этой функции использует NRVO, а другой вызов той же функции — нет

Сообщение Anonymous »

— структура с двумя открытыми членами; параметризованный конструктор, который печатает целочисленный конструктор с именем; конструктор копирования, который печатает конструктор копирования, называемый; конструктор перемещения, который печатает конструктор перемещения, называемый.
Функция 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");
}
Вывод этого кода:

Код: Выделить всё

C:\copy elision>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.

C:\copy elision> g++ question.cpp -std=c++23

C:\copy elision>a
Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
move constructor called
Made Vector

C:\copy elision>
Однако я ожидал следующего результата из-за NRVO

Код: Выделить всё

Making Vector
integer constructor called
Made Vector
Making Another Vector
integer constructor called
Made Vector

Я был бы очень признателен за объяснение того, почему локальная переменная B в 'makeVectorx5y5IfNotZero

Код: Выделить всё

is moved into the local variableБof
main`, а не просто создавать одну переменную по тому же адресу памяти.

Подробнее здесь: https://stackoverflow.com/questions/792 ... same-funct
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему один вызов этой функции использует NRVO, а другой вызов той же функции — нет?
    Anonymous » » в форуме C++
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Почему один вызов этой функции использует NRVO, а другой вызов той же функции — нет?
    Anonymous » » в форуме C++
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • Почему один вызов этой функции использует NRVO, а другой вызов той же функции — нет?
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Почему один вызов этой функции использует NRVO, а другой вызов той же функции — нет?
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Можно ли использовать NRVO и семантику перемещения вместе в C++?
    Anonymous » » в форуме C++
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»