Difference between revisions of "Intermediate C++ Game Programming Tutorial 20"

From Chilipedia
Jump to: navigation, search
(Video Timestamp Index)
(Video Timestamp Index)
Line 36: Line 36:
 
** This makes the compiler dispatch a function call to the overloaded version when an rvalue is passed <br />(note: <code>&&</code> was added in c++11; <code>&</code> is the familiar lvalue reference declarator)
 
** This makes the compiler dispatch a function call to the overloaded version when an rvalue is passed <br />(note: <code>&&</code> was added in c++11; <code>&</code> is the familiar lvalue reference declarator)
 
</div>
 
</div>
* Converting a variable into an rvalue reference using <code>std::move()</code>[https://youtu.be/93mlQnWbyuk?t=8m00s 8:00]
+
* <code>std::move()</code>: Converting a variable into an rvalue reference [https://youtu.be/93mlQnWbyuk?t=8m00s 8:00]
 
** This will allow the function to steal/use the resource(s) that are passed in
 
** This will allow the function to steal/use the resource(s) that are passed in
 
** This can be useful if you don't need those resources anymore
 
** This can be useful if you don't need those resources anymore

Revision as of 05:16, 20 October 2019

In this video we learn about r-value reference and move semantics, which is perhaps the most important feature that was added in the C++11 update. This is going to allow us to manage and transfer our resources in a precise and efficient manner. It is sexy as fuck and I love it.

Topics Covered

  • r-values and l-values
  • r-value reference function overloading
  • Move constructor and move assigment
  • Rule of 5
  • std::move
  • std::make_move_iterator

Video Timestamp Index

Tutorial 20

[Expand]
  • Why are move semantics important and required? 0:23
  • What is an rvalue (simple definition) 2:48
  • Why is the distinction between rvalues and lvalues useful? 4:57
  • Overloading a function to take an rvalue reference using && 6:11
  • std::move(): Converting a variable into an rvalue reference 8:00
    • This will allow the function to steal/use the resource(s) that are passed in
    • This can be useful if you don't need those resources anymore
    • std::move() is shorthand (from the STL) for the static cast static_cast<Type&&>(var)
  • WORK-IN-PROGRESS

Note

If you are using Visual Studio 2017, you might notice that our move members are not being used during std::vector growth even after we have 'properly' implemented them. This is expected, so don't pay it much mind at the moment.

The reason for this is that std::vector will only use the move members if they are guaranteed not to throw any exceptions (as per the standard). This issue will be dealt with in Intermediate 22 (tutorial on exceptions). For your interest, you can enable the move optimization by declaring your move ctor as Surface( Surface&& ) noexcept. The same should be done for the move assignment and the destructor.

You might wonder why Chili had no problems in the video. In the video, Chili was using Visual Studio 2015, which does not conform to the standard in this point, so it uses the move members regardless of whether or not they are marked noexcept.

Source Code

See also