F1 2021 Testing Day 2 Results,
F1 2021 Testing Day 2 Results,
Mark And Lynda Thompson Podcast,
Articles V
You can create a std::span from a pointer and a size. Using 2011-2022, Bartlomiej Filipek c++14 unique_ptr and make unique_ptr error use of deleted function 'std::unique-ptr'. Thus instead of waiting for the memory, it will be already in the cache! Therefore, we need to move these 2 thread objects in vector i.e. call function findMatches. Containers of the STL become with C++20 more powerful. So, as usual, its best to measure and measure. pointers on the heap: Vector of Objects vs Vector of So the vector manages it for you instead of just managing the pointer and letting you deal with the pointed object. How to approach copying objects with smart pointers as class attributes? Using vectors of pointers #include
#include using namespace std; static const int NUM_OBJECTS = 10; Design Pattern und Architekturpattern mit C++: Training, coaching, and technology consulting, Webinar: How to get a job at a high-frequency trading digital-assets shop, One Day left: Early Bird Price for my Mentoring Program "Design Patterns and Architectural Patterns with C++", The Lack of Training Culture: You hire for Skills but not for Attitude, 45% Student Discount for my Mentoring Program: "Design Patterns and Architectural Patterns with C++", One Week left: Early Bird Price for my Mentoring Program "Design Patterns and Architectural Patterns with C++", 20 Days Left: Early Bird Price for my Mentoring Program "Design Patterns and Architectural Patterns with C++", The Lack of Training Culture: An Employer must support their Employees, Argument-Dependent Lookup and the Hidden Friend Idiom, Early Bird Price for my Mentoring Program "Design Patterns and Architectural Patterns with C++", Webinar: C++ with Python for Algorithmic Trading, Registration is Open for my Mentoring Program "Design Patterns and Architectural Patterns with C++", And the Five Winners for "Template Metaprogramming with C++" are, Five Coupons for the eBook "Template Metaprogramming with C++", The Singleton: The Alternatives Monostate Pattern and Dependency Injection, The Factory Method (Slicing and Ownership Semantics), And the Five Winners for the "C++20 STL Cookbook" are, About Algorithms, Frameworks, and Pattern Relations, Five Giveaway eBooks for "C++20 STL Cookbook", And the Five Winners for "C++ Core Guidelines: Best Practices for Modern C++". when working with a vector of pointers versus a vector of value types. Disclaimer: Any opinions expressed herein are in no way representative of those of my employers. In our WebA possible solution could be using a vector of smart pointers such as shared_ptr, however at first you should consider whether you want to use a vector of pointers at first place. We use unique_ptr so that we have clear ownership of resources while having almost zero overhead over raw pointers. Some objects are cheaper to construct/copy contruct/move construct/copy/move/destruct than others, regardless of size. For our benchmark we have to create array of pointers or objects before vectors of pointers. On the diagram above, you can see that all elements of the vector are next to each other in the memory block. In the case of an array of pointers to objects, you must free the objects manually if that's what you want. How to Switch Between Blas Libraries Without Recompiling Program, Weird Behavior of Right Shift Operator (1 >> 32), How to Compile Qt 5 Under Windows or Linux, 32 or 64 Bit, Static or Dynamic on Visual Studio or G++, What Is Shared_Ptr's Aliasing Constructor For, Why Istream Object Can Be Used as a Bool Expression, Reading from Ifstream Won't Read Whitespace, Using Qsocketnotifier to Select on a Char Device, What Is the Easiest Way to Parse an Ini File in C++, Does Vector::Erase() on a Vector of Object Pointers Destroy the Object Itself, Is Adding to a "Char *" Pointer Ub, When It Doesn't Actually Point to a Char Array, What Is the Purpose of Using -Pedantic in the Gcc/G++ Compiler, How Can My C/C++ Application Determine If the Root User Is Executing the Command, Returning Temporary Object and Binding to Const Reference, Is 'Long' Guaranteed to Be at Least 32 Bits, Does "Const" Just Mean Read-Only or Something More, How to Force a Static Member to Be Initialized, What Does the "Lock" Instruction Mean in X86 Assembly, Why Isn't 'Int Pow(Int Base, Int Exponent)' in the Standard C++ Libraries, About Us | Contact Us | Privacy Policy | Free Tutorials. They are very random and the CPU hardware prefetcher cannot cope with this pattern. You haven't provided nearly enough information. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions. The real truth can be found by profiling the code. Boost MultiIndex - objects or pointers (and how to use them?)? The Five (Seven) Winners of my C++20 book are: Resolving C/C++ Concurrency Bugs More Efficiently with Time Travel Debugging, Cooperative Interruption of a Thread in C++20, Barriers and Atomic Smart Pointers in C++20, Performance Comparison of Condition Variables and Atomics in C++20, Looking for Proofreaders for my New Book: C++20, Calendar and Time-Zones in C++20: Calendar Dates, Calendar and Time-Zones in C++20: Time-Zones, Calendar and Time-Zones in C++20: Handling Calendar Dates, Calendar and Time-Zones in C++20: Time of Day, C++20: Extend std::format for User-Defined Types, More Convenience Functions for Containers with C++20, constexpr std::vector and std::string in C++20, Five Vouchers to win for the book "Modern C++ for Absolute Beginners", volatile and Other Small Improvements in C++20, Compiler Explorer, PVS-Studio, and Terrible Simple Bugs, The C++ Standard Library: The Third Edition includes C++20, Solving the Static Initialization Order Fiasco with C++20, Two new Keywords in C++20: consteval and constinit, C++20: Optimized Comparison with the Spaceship Operator, C++20: More Details to the Spaceship Operator, C++20: Module Interface Unit and Module Implementation Unit, Face-to-Face Seminars and Online Seminars are different, C++20: Thread Synchronization with Coroutines, C++20: An Infinite Data Stream with Coroutines, Looking for Proofreaders for my new Book: C++ Core Guidelines, C++20: Pythons range Function, the Second, C++20: Functional Patterns with the Ranges Library. The declaration: vector v(5); creates a vector containing five null pointers. WebFigure 3: An empty Vector object. It affects the behavior invoked by using this pointer since the object it points to no longer exists. When an object is added to the vector, it makes a copy. As vector contains various thread objects, so when this vector object is destructed it will call destructor of all the thread objects in the vector. * Problem Space Uups this time we cannot use data loaded in the second cache line read (from the first step), because the second particle data is located somewhere else in the memory! All data and information provided on this site is for informational purposes only. Calling a destructor on a pointer value does nothing. It can be done using 2 steps: Square brackets are used to declare fixed size. Thus when you do this delete entities[x + y * width]; you indeed delete the YourType instance, but the pointer still exists and it sill in your vector. Strongly recommand you use smart pointer as Chris mentioned, then you don't need to worry about deleting object pointer when you delete element from STL container, demo as below: From your sample code, I assume your vector is defined somewhat like this: Therefore, your vector does not contain YourType objects, but pointer to YourType. If all you care about is the objects, then they are more or less equivalent; you just have an extra level of indirection. I've recently released a new book on Modern C++: runs generate method - so that we have some random numbers assigned. This is a bad design at any rate, because the vector can internally make copies of the stored objects, so pointers to those objects will be invalidated on a regular basis. Built on the Hugo Platform! When a vector is passed to a function, a copy of the vector is created. C++: Vector of objects vs. vector of pointers to new objects? Particles vector of objects: mean is 69ms and variance should be ok. If you want that, store smart pointers instead, ie std::unique_ptr or std::shared_ptr. particles example I just wanted to test with 1k particles, 2k. The Type-Traits Library: Type Comparisons, And the Winners for the Seven Vouchers for Fedor's Book "The Art of Writing Efficient Programs" are, Template Metaprogramming - Hybrid Programming, Seven Voucher for Fedor G. Pikus Book "The Art of Writing Efficient Programs", Template Metaprogramming - How it All Started, Visiting a std::variant with the Overload Pattern, Smart Tricks with Parameter Packs and Fold Expressions, The New pdf Bundle is Ready: C++20 Modules, From Variadic Templates to Fold Expressions, C++20 Modules: Private Module Fragment and Header Units, Variadic Templates or the Power of Three Dots, And the Winners for the Five Vouchers for Stephan's Book "Clean C++20" are, Performance of the Parallel STL Algorithms, Parallel Algorithms of the STL with the GCC Compiler, Five Vouchers for Stephan Roth's Book "Clean C++20" to Win, Full Specialization of Function Templates, Template Specialization - More Details About Class Templates, Template Argument Deduction of Class Templates, The New pdf Bundle is Ready: C++20 Coroutines, "Concurrency with Modern C++" Update to C++20, Surprise Included: Inheritance and Member Functions of Class Templates, Function Templates - More Details about Explicit Template Arguments and Concepts, Printed Version of C++20 & Source Code on GitHub, Automatically Resuming a Job with Coroutines on a Separate Thread, A Generic Data Stream with Coroutines in C++20, An Infinite Data Stream with Coroutines in C++20, Executing a Future in a Separate Thread with Coroutines, Implementing Simple Futures with Coroutines. https://www.youtube.com/watch?v=YQs6IC-vgmo, Here is an excelent lecture by Scott Meyers about CPU caches: https://www.youtube.com/watch?v=WDIkqP4JbkE. We can also ask another question: are pointers in a container always a bad thing? As you can see this time, we can see the opposite effect. This may be performance hit because the processor may have to reload the data cache when dereferencing the pointer to the object. Additionally, the hardware Prefetcher cannot figure out the pattern - it is random - so there will be a lot of cache misses and stalls. I think it has something to do with push_back and the capacity of the vector and if the capacity is reached a new vector that uses new contiguous addresses that don't contain the right objects is created. How to use find algorithm with a vector of pointers to objects in c++? In general you may want to look into iterators when using containers. Interesting thing is when I run the same binary on the same hardware, With this more advanced setup we can run benchmarks several times over Check out the Boost documentation. Check it out here: Examples of Projections from C++20 Ranges, Fun with printing tables with std::format and C++20, std::initializer_list in C++ 2/2 - Caveats and Improvements. C++ Core Guidelines: More Non-Rules and Myths, More Rules about the Regular Expression Library, C++ Core Guidelines: Improved Performance with Iostreams, Stuff you should know about In- and Output with Streams, More special Friends with std::map and std::unordered_map, C++ Core Guidelines: std::array and std::vector are your Friends, C++ Core Guidelines: The Standard Library, C++ Core Guidelines: The Remaining Rules about Source Files, The new pdf bundle is available: C++ Core Guidlines - Templates and Generic Programming, Types-, Non-Types, and Templates as Template Parameters, C++ Core Guidelines: Surprise included with the Specialisation of Function Templates, C++ Core Guidelines: Other Template Rules, C++ Core Guidelines: Programming at Compile Time with constexpr, C++ Core Guidelines: Programming at Compile Time with Type-Traits (The Second), C++ Core Guidelines: Programming at Compile Time with the Type-Traits, C++ Core Guidelines: Programming at Compile Time, C++ Core Guidelines: Rules for Template Metaprogramming, C++ Core Guidelines: Rules for Variadic Templates, C++ Core Guidelines: Rules for Templates and Hierarchies, C++ Core Guidelines: Ordering of User-Defined Types, C++ Core Guidelines: Template Definitions, C++ Core Guidelines: Surprises with Argument-Dependent Lookup, C++ Core Guidelines: Regular and SemiRegular Types, C++ Core Guidelines: Pass Function Objects as Operations, I'm Proud to Present: The C++ Standard Library including C++14 & C++17, C++ Core Guidelines: Definition of Concepts, the Second, C++ Core Guidelines: Rules for the Definition of Concepts, C++ Core Guidelines: Rules for the Usage of Concepts. WebYou use a vector of pointers when you need a heterogeneous container of polymorphic objects, or your objects need to persist against operations performed on the vector, for 1. we might create a bit more advanced scenarios for our benchmarks. Class members that are objects - Pointers or not? Such benchmark code will be executed twice: once during the This contiguous memory can be a plain array, a pointer with a size, a std::array, a std::vector, or a std::string. The small program shows the usage of the function subspan. It doesn't affect the pointer. WebVector of Objects A vector of Objects has first, initial performance hit. In C++, should different game entities have different classes? what we get with new machine and new approach. Eiffel is a great example of Design by Contract. affected by outliers. Note about C++11: reference_wrapper has also been standardized in C++11 and is now usable as std::reference_wrapper without Boost. Then we can take it and use In this article we will create a vector thread and discuss things which we need to take care while using it. To fully understand why we have such performance discrepancies, we need to talk about memory latency. Deleting the object will not get rid of the pointers, in neither of the arrays. In contrast, span2 only references all elements of the underlying vec without the first and the last element (2). The vector will also make copies when it needs to expand the reserved memory. The rest - 56b - are the bytes of the second particle. * Z Score. You may remember that a std::span is sometimes called a view.Don't confuse a std::span with a view from the ranges library (C++20) or a std::string_view (C++17). You should use a vector of handles to Object (see the Bridge design pattern) rather than naked pointers. Do you optimise for memory access patterns? Should I store entire objects, or pointers to objects in containers? Please check your email and confirm the newsletter subscription. * Mean (us) A typical implementation consists of a pointer to its first element and a size. How do you know? In In Re Man. * Min (us) WebStore pointers to your objects in a vectorinstead But if you do, dont forget to deletethe objects that are pointed to, because the vectorwont do it for you. It also avoids mistakes like forgetting to delete or double deleting. span1 references the std::vector vec(1). The problem, however, is that you have to keep track of deleting it when removing it from the container. How to use find algorithm with a vector of pointers to objects in c++? You have to manually iterate the vector and delete the pointers yourself when you know they're dynamically allocated, or better, use std::unique_ptr and you never need to call delete on anything. 2k 10k without writing code separately. Full repository can be found here: github/fenbf/PointerAccessTest but the code is also tested with Quick Bench: Theres also experimental code at https://github.com/fenbf/benchmarkLibsTest where I wrote the same benchmark with a different library: Celero, Google Benchmark, Nonius or Hayai (and see the corresponding blog post: Revisiting An Old Benchmark - Vector of objects or pointers). Otherwise, it is generally better not to store pointers for exactly the reason that you mentioned (automatic deallocation). This decay is a typical reason for errors in C/C++. Premise : In C++ it is convenient to store like object instances in std containers (eg: std::vector). If we will try to change the value of any element in vector of thread directly i.e. By a different container, are you talking about a list? Some of the code is repeated, so we could even simplify this a bit more. Due to how CPU caches work these days, things are not simple anymore. The size of std::vector is fixed, because it essentially just contains a pointer to the real data that is dynamically allocated. Note about C++11: In C++11 shared_ptr became part of the standard as std::shared_ptr, so Boost is no longer required for this approach. My question is simple: why did using a vector of pointers work, and when would you create a vector of objects versus a vector of pointers to those objects? benchmarking libraries for a spreadsheed to analyze it and produce charts. With Nonius I have to write 10 benchmarks separately. Why can't `auto&` bind to a volatile rvalue expression? Difference between constant pointer, pointers to constant, and constant pointers to constants, vector::front() and vector::back() in C++ STL, vector::empty() and vector::size() in C++ STL, vector::operator= and vector::operator[ ] in C++ STL, vector::at() and vector::swap() in C++ STL, vector::begin() and vector::end() in C++ STL, vector :: cbegin() and vector :: cend() in C++ STL, How to flatten a Vector of Vectors or 2D Vector in C++, vector::crend() & vector::crbegin() with example, vector::push_back() and vector::pop_back() in C++ STL. Particles vector of pointers: mean is 121ms and variance is not samples. As for your first question, it is generally preferred to use automatically allocated objects rather than dynamically allocated objects (in other words, not to store pointers) so long as for the type in question, copy-construction and assignment is possible and not prohibitively expensive. for 80k of objects was 266% slower than the continuous case. WebIn that case, when you push_back(something), a copy is made of the object. Disclaimer: Any opinions expressed herein are in no way representative of those of my employers. In contrast, std::span automatically deduces the size of contiguous sequences of objects. measurements/samples) and only one iteration (in Nonius there was 100 You must also ask yourself if the Objects or the Object* are unique. If we use default deleter or stateless deleter, then theres no extra memory use. Yes and no. Let us know in comments. std::vector and other containers will just remove the pointer, they won't free the memory the pointer points to. A couple of problems crop up when an object contains a pointer to dynamic storage. A better, yet simple, way to do the above, is to use boost::shared_ptr: The next C++ standard (called C++1x and C++0x commonly) will include std::shared_ptr. You just need to A vector of Objects has first, initial performance hit. It will crash our application, because on replacing a thread object inside the vector, destructor of existing thread object will be called and we havent joined that object yet.So, it call terminate in its destructor. All of the big three C++ compilers MSVC, GCC, and Clang, support std::span. It seems that you have already subscribed to this list. To make polymorphism work You have to use some kind of pointers. Which pdf bundle should I provide? How to erase & delete pointers to objects stored in a vector? That means the pointer you are saving is not a pointer to the object inside the vector. A view (std::span) and a std::string_view are non-owning views and can deal with strings. Containers of pointers let you avoid the slicing problem. We can use the vector of pointers to manage values that are not stored in continuous memory. std::unique_ptr does the deletion for free: I suggest to use it instead. C++20: Define the Concept Regular and SemiRegular, C++20: Define the Concepts Equal and Ordering, A Brief Overview of the PVS-Studio Static Code Analyzer, C++20: Two Extremes and the Rescue with Concepts, The new pdf bundle is ready: C++ Core Guidelines: Performance, "Concurrency with Modern C++" has a new chapter, C++ Core Guidelines: Naming and Layout Rules, C++ Core Guidelines: Lifetime Safety And Checking the Rules, C++ Core Guidelines: Type Safety by Design. Safety and Robustness are also more important. allocated in a continuous memory block vs allocated individually as It Here is a quote from Eric Nieblersrange-v3 implementation,which is the base for the C++20 ranges: "Views are composable adaptations of ranges where the adaptation happens lazily as the view is iterated." 1. * Kurtosis So, can be called a pointer array, and the memory address is located on the stack memory rather than the heap memory. Click below to consent to the above or make granular choices. How to initialise a vector of pointers based on the vector of objects in c++ in the most elegant way? Using std::unique_ptr with containers in c++0x is similar to the ptr_container library in boost. If the objects are in dynamic memory, the memory must be initialized first (allocated). Your choices will be applied to this site only. Finally, the for-loop (3) uses the function subspan to create all subspans starting at first and having count elements until mySpan is consumed. However, unless you really need shared ownership, it is recommended you use std::unique_ptr, which was newly introduced in C++11. Not consenting or withdrawing consent, may adversely affect certain features and functions. So for the second particle, we need also two loads. C++, Member function returning const reference to vector containing pointers to const objects, Vector of pointers to member functions with multiple objects c++, Vector of objects containing references or pointers. If a second is significant, expect to access the data structures more times (1E+9). space and run benchmark again. Question/comment: as far as I understand span is not bounds-safe. Yes, it is possible - benchmark it. Obviously there is very good locality of access to both arrays. Lets Create a vector of std::thread objects i.e. Built on the Hugo Platform! * Baseline us/Iteration But then you have to call delete However, the items will automatically be deleted when the vector is destructed. Check out this lecture about linked lists by Bjarne Stroustrup: If you need to store objects of multiple polymorphic types in the same vector, you must store pointers in order to avoid slicing. Use nullptr for not existing object Instead of the vector of Objects, the Pool will store the vector of pointers to Objects. appears that if you create one pointer after another they might end up If you have objects that take a lot of space, you can save some of this space by using COW pointers. You truly do not want to use global variables for anything without extremely good reason. and returns the pointer to the vector of objects to a receiver in main function. C++, Search a vector of objects by object attribute, Vector of const objects giving compile error. These seminars are only meant to give you a first orientation. To provide the best experiences, we use technologies like cookies to store and/or access device information. As a number of comments have pointed out, vector.erase only removes the elements from the vector. This may be a performance savings depending on the object size. The difference is in object lifetime and useability; the speed is insignificant. Make your choice! library When I run Celero binary in Any other important details? The quite close in the memory address space. This time each element is a pointer to a memory block allocated in a possibly different place in RAM. Binary search with returned index in STL? All right - if I go back to my original point, say I have an array of a hundred. With the Celero As you can see we can even use it for algorithms that uses two Is passing a reference through function safe? You will have to explicitly call delete on each contained pointer to delete the content it is pointing to, for example: Storing raw pointers in standard containers is not a good idea. Note that unless you have a good reason, you should probably not store the pointer in the vector, but the object itsself. Sometimes you want a vector of objects, sometimes you want a vector of pointers to objects, and sometimes you want something else entirely. and "C++17 - Avoid Copying with std::string_view". Or maybe you have some story to share? C++: Vector of objects vs. vector of pointers to new objects? dimensional data range. Deletion of the element is not as simple as pop_back in the case of pointers. However its also good to remember that when the object inside a container is heavy it might be better to leave them in the same place, but use some kind of indexing when you sort or perform other algorithms that move elements around. Copying a pointer into a vector is not dependent on the object size. Course: Modern C++ Concurrency in Practice, Course: C++ Standard Library including C++14 & C++17, Course: Embedded Programming with Modern C++, Course: C++ Fundamentals for Professionals, Interactive Course: The All-in-One Guide to C++20, Subscribe to the newsletter (+ pdf bundle), std::span in C++20: Bounds-Safe Views for Sequences of Objects, Automatically deduces the size of a contiguous sequence of objects, Create a std::span from a pointer and a size, Design Patterns and Architectural Patterns with C++, Clean Code: Best Practices fr modernes C++. In your case, you do have a good reason, because you actually store a non-owning pointer. How to erase & delete pointers to objects stored in a vector? We can perform this task in certain steps. How do I initialize a stl vector of objects who themselves have non-trivial constructors? This works perfectly for particles test You can change your settings at any time, including withdrawing your consent, by using the toggles on the Cookie Policy, or by clicking on the manage consent button at the bottom of the screen. doing Java the C++ way), sending lparam as a pointer to class, and use it in WndProc(), C++ last digit of a random sequence of powers, Function return in branches of an `if` vs outside the `if`, in C++, QLineEdit could not set shortcuts when it's in focus, Physical Boost.Units User Defined Literals, Why does std queue not define a swap method specialisation, Linking C++ to static library; undefined reference errors. All Rights Reserved. How can I point to a member of a std::set in such a way that I can tell if the element has been removed? The raw pointers must be deleted before the vector can be destructed; or a memory leak is created. What is going to happen is called object slicing. Two cache line reads. Nonius performs some statistic analysis on the gathered data. The main reason for having a std::span is that a plain array will be decay to a pointer if passed to a function; therefore, the size is lost. Most of the time its better to have objects in a single memory block. Overloading, variadic functions and bool type, Unable to discriminate template specialization with enable_if and is_base_of. The main difference between a std::span and a std::string_view is that a std::span can modify its objects. C++ Core Guidelines: Type Erasure with Templates, C++ Core Guidelines: Rules for Templates and Generic Programming, C++ Core Guidelines: Rules for Constants and Immutability, The new pdf bundle is ready: C++ Core Guidelines - Concurrency and Parallelism, I'm Proud to Present: Modern C++ Concurrency is available as interactive course, C++ Core Guidelines: Rules about Exception Handling, C++ Core Guidelines: The noexcept Specifier and Operator, C++ Core Guidelines: A Short Detour to Contracts in C++20, C++ Core Guidelines: Rules for Error Handling, C++ Core Guidelines: The Remaining Rules about Lock-Free Programming, C++ Core Guidelines: The Resolution of the Riddle, C++ Core Guidelines: Concurrency and lock-free Programming, The Update of my Book "Concurreny with Modern C++", C++ Core Guidelines: Be Aware of the Traps of Condition Variables, C++ Core Guidelines: More Traps in the Concurrency, C++ Core Guidelines: Taking Care of your Child Thread, C++ Core Guidelines: Sharing Data between Threads, C++ Core Guidelines: Use Tools to Validate your Concurrent Code, C++ Core Guidelines: More Rules about Concurrency and Parallelism, C++ Core Guidelines: Rules for Concurrency and Parallelism, The new pdf bundle is ready: Functional Features in C++, C++ Core Guidelines: The Remaining Rules about Performance, C++ Core Guidelines: More Rules about Performance, The Truth about "Raw Pointers Removed from C++", No New New: Raw Pointers Removed from C++, C++ Core Guidelines: Rules about Performance, C++ Core Guidelines: Rules about Statements and Arithmetic, C++ Core Guidelines: More about Control Structures, C++ Core Guidelines: To Switch or not to Switch, that is the Question, C++ Core Guidelines: Rules for Statements, C++ Core Guidelines: Rules for Conversions and Casts, C++ Core Guidelines: More Rules for Expressions, C++ Core Guidelines: Rules for Expressions, C++ Core Guidelines: More Rules for Declarations, C++ Core Guidelines: Declarations and Initialisations, C++ Core Guidelines: Rules for Expressions and Statements, C++ Core Guidelines: Passing Smart Pointers, C++ Core Guidelines: Rules for Smart Pointers, The new pdf bundle is available: Embedded - Performance Matters, C++ Core Guidelines: Rules for Allocating and Deallocating, C++ Core Guidelines: Rules about Resource Management, C++ Core Guidelines: Rules for Enumerations, C++ Core Guidelines: More Rules for Overloading, C++ Core Guidelines: Rules for Overloading and Overload Operators, The C++ Standard Library: The Second Edition includes C++17, C++ Core Guidelines: Accessing Objects in a Hierarchy, C++ Core Guidelines: The Remaining Rules about Class Hierarchies, The new pdf bundle is available: Functional Programming with C++17 and C++20, C++ Core Guidelines: More Rules about Class Hierarchies, C++ Core Guidelines: Function Objects and Lambdas, C++ Core Guidelines: Comparison, Swap, and Hash, C++ Core Guidelines: Rules for Copy and Move, My open C++ Seminars in the First Half of 2018, I Proudly present my Book is Ready "Concurrency with Modern C++", C++ Core Guidelines: The Rule of Zero, Five, or Six, C++ Core Guidelines: Semantic of Function Parameters and Return Values, C++ Core Guidelines: The Rules for in, out, in-out, consume, and forward Function Parameter, "Concurrency with Modern C++" is 95% complete; Including all Source Files, C++ Core Guidelines: Function Definitions, C++ Core Guideline: The Guideline Support Library, My Book "Concurrency with Modern C++" is 75% complete, My Book "Concurrency with Modern C++" is 50% complete, Get the Current Pdf Bundle: "Multithreading: The High-Level Interface", My Book "Concurrency with Modern C++" is 30% complete.