returning aligned memory with new?
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
:
- The C++ standard requires that a valid pointer is returned even if the size passed to it is 0.
- There's also
operator new[]
andoperator delete[]
, so don't forget about overloading those. - 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.
精彩评论