Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

returning aligned memory with new?

Tags:

c++

alignment

I currently allocate my memory for arrays using the MS specific mm_malloc. I align the memory, as I'm doing some heavy duty math and the vectorization takes advantage of the alignment. I was wondering if anyone knows how to overload the new operator to do the same thing, as I feel dirty malloc'ing everywhere (and would eventually like to also compile on Linux)? Thanks for any help

like image 742
Steve Avatar asked Apr 17 '10 21:04

Steve


2 Answers

First of all, it's important to note that new and delete can be overloaded either globally, or just for a single class. Both cases are shown in this article. Also important to note is that if you overload new you almost certainly also want to overload delete.

There are a few important notes about operator new and operator delete:

  1. The C++ standard requires that a valid pointer is returned even if the size passed to it is 0.
  2. There's also operator new[] and operator delete[], so don't forget about overloading those.
  3. Derived classes inherit operator new and its brethren, so make sure to override those.

In Effective C++, item 8, Scott Meyers includes some pseudocodish examples:

void * operator new(size_t size)        // your operator new might
{                                       // take additional params
  if (size == 0) {                      // handle 0-byte requests
    size = 1;                           // by treating them as
  }                                     // 1-byte requests
  while (1) {
    attempt to allocate size bytes;
    if (the allocation was successful)
      return (a pointer to the memory);

    // allocation was unsuccessful; find out what the
    // current error-handling function is (see Item 7)
    new_handler globalHandler = set_new_handler(0);
    set_new_handler(globalHandler);

    if (globalHandler) (*globalHandler)();
    else throw std::bad_alloc();
  }
}


void operator delete(void *rawMemory)
{
  if (rawMemory == 0) return;    // do nothing if the null
                                 // pointer is being deleted
  deallocate the memory pointed to by rawMemory;
  return;
}

For more information, I'd definitely pick up Effective C++.

like image 159
rlbond Avatar answered Oct 08 '22 03:10

rlbond


new is required to return a pointer [...] suitably aligned so that it can be converted to a pointer of any complete object type (§3.7.3.1 of the standard).

FWIW, C++ 0x will add an alignof that will tell you the alignment necessary for a particular type.

like image 41
Jerry Coffin Avatar answered Oct 08 '22 04:10

Jerry Coffin