Как мне следует использовать эти аргументы, чтобы обеспечить оптимизацию возвращаемого значения?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как мне следует использовать эти аргументы, чтобы обеспечить оптимизацию возвращаемого значения?

Сообщение Anonymous »

Я хочу имитировать, как Rust обрабатывает ошибки в C++, и я знаю, что использование std::move может запретить RVO и, возможно (я не уверен), использование ссылок на r-значения. Мне было интересно, как мне передать аргументы конструктора в класс Result:

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

enum ResultEnum : unsigned char { Ok, Err };

template 
struct Result
{
private:
ResultEnum result;
public:
Result(ResultEnum result, const T& t) /* SHOULD I TAKE THE ARGUMENT BY COPY, REFERENCE OR FORWARDING/UNIVERSAL REFERENCE */
{
this->t = t; /* WHAT WOULD BE BEST HERE? std::move???*/
this->result = result;
}
Result(ResultEnum result, const E& err) /* SAME HERE, COPY, REF OR FORWARDING/UNIVERSAL REF? */
{
this->e = err; /* WHAT WOULD BE BEST HERE? std::move??? Will std::move prevent RVO?*/

this->result = result;
}
union
{
T t;
E e;
};

bool is_ok() const{ return result == ResultEnum::Ok; }
bool is_err() const{ return result == ResultEnum::Err; }

};

struct MyFoo {};

Result createMyFoo()
{
MyFoo f;
return { Ok, f }; /* CAN I EXPECT RVO HERE? WHAT EFFECT WOULD CHANGING THE CONSTRUCTOR ARGUMENTS MAKE, IE., COPY vs REF vs FORWARDING/UNIVERSAL REF */
}

int main()
{
auto f = createMyFoo();
if (f.is_err())
{
/* SOMETHING */
}
}
Внутри конструктора, предполагая, что происходит RVO, могу ли я предположить, что любое присваивание внутри конструктора напрямую присваивает возвращаемое значение в кадре стека вызовов?

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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