Why were the non-placement new
expression and the delete
expression implemented as language built-in instead of regular functions?
If we have...
a way of requesting/giving back memory to the OS
a way of explicitly invoking a constructor (placement new
)
a way of explicitly invoking a destructor (~T()
)
...why couldn't non-placement new
and delete
just be regular functions in the Standard Library? Example:
template <typename T, typename... Ts>
T* library_new(Ts&&... xs)
{
auto* ptr = /* request enough memory for `T` from OS */;
new (ptr) T(std::forward<Ts>(xs)...);
return ptr;
}
template <typename T>
void library_delete(T* ptr)
{
ptr->~T();
/* reclaim memory for `T` from OS */
}
Placement new allows you to construct an object in memory that's already allocated. You may want to do this for optimization when you need to construct multiple instances of an object, and it is faster not to re-allocate memory each time you need a new instance.
Placement deleteIt is not possible to call any placement operator delete function using a delete expression. The placement delete functions are called from placement new expressions. In particular, they are called if the constructor of the object throws an exception.
Placement new This is used to construct objects in allocated storage: // within any block scope... { // Statically allocate the storage with automatic storage duration // which is large enough for any object of type `T`.
There's no new / delete expression in C. The closest equivalent are the malloc and free functions, if you ignore the constructors/destructors and type safety.
If the user's goal was to create an object in some memory location, then new
seemed like a natural approach since forwarding references, variadic templates and placement new were not a thing back in those days. As correctly pointed out by @T.C. templates were released in 1990 and placement new in 1989. Variadic templates on the other hand, became a part of C++ only in C++11.
tl;dr There was no way to forward a bunch of arguments to a constructor of an arbitrary type (as you can do these days with make
functions).
Maybe this is not the best reference but this is what Wikipedia says about placement new
in C++:
In earlier versions of C++ there was no such thing as placement new; instead, developers used explicit assignment to
this
within constructors to achieve similar effect. This practice has been deprecated and abolished later, and third edition of The "C++ Programming Language" doesn't mention this technique. Support for placement new operator has been added to compilers circa 1995.
Maybe in 2017 it is possible to implement new
as a standard library function. Your suggested implementation uses language features that were added recently (many of them after 2010).
The C++ language, however, is much older (since 1983) and in the beginning there were no variadic templates, no typename
, no placement new
, no forwarding references.
In the beginning there was only the regular new
and it had to be a language feature at that time because there was no way to implement it as a library function.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With