New/Delete Builtins (Using the GNU Compiler Collection (GCC))

### 7.11 Built-in functions for C++ allocations and deallocations ¶

GNU C++ provides builtins that are equivalent to calling `::operator new` or `::operator delete` with the same arguments. It is an error if the selected `::operator new` or `::operator delete` overload is not a replaceable global operator. For optimization purposes, calls to pairs of these builtins can be omitted if access to the allocation is optimized out, or could be replaced with an implementation-provided buffer on the stack, or multiple allocation calls can be merged into a single allocation. In C++ such optimizations are normally allowed just for calls to such replaceable global operators from `new` and `delete` expressions.

    void foo () {
      int *a = new int;
      delete a; // This pair of allocation/deallocation operators can be omitted
    	    // or replaced with int _temp; int *a = &_temp; etc.
      void *b = ::operator new (32);
      ::operator delete (b); // This one cannot.
      void *c = __builtin_operator_new (32);
      __builtin_operator_delete (c); // This one can.
    }

These built-ins are only available in C++.

Built-in Function: `void *` __builtin_operator_new `(std::size_t size, ...)` ¶

  This is the built-in form of `operator new`. It accepts the same argument forms as a “usual allocation function”, as described in the C++ standard.

Built-in Function: `void` __builtin_operator_delete `(void * ptr, ...)` ¶

  This is the built-in form of `operator delete`. It accepts the same argument forms as a “usual deallocation function”, as described in the C++ standard.