开发者

returning aligned memory with new?

开发者 https://www.devze.com 2022-12-27 11:53 出处:网络
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 w开发者_运维

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 w开发者_运维问答as 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


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++.


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.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号