5.3.4 [expr.new] of the C++11 Feb draft gives the example:
new(2,f) T[5]results in a call ofoperator new[](sizeof(T)*5+y,2,f).Here, x and y are non-negative unspecified values representing array allocation overhead; the result of the new-expression will be offset by this amount from the value returned by
operator new[]. This overhead may be applied in all array new-expressions, including those referencing the library functionoperator new[](std::size_t, void*)and other placement allocation functions. The amount of overhead may vary from one invocation of new to another. —end example ]
Now take the following example code:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10]; According to the above quote, the second line new (buffer) std::string[10] will internally call operator new[](sizeof(std::string) * 10 + y, buffer) (before constructing the individual std::string objects). The problem is that if y > 0, the pre-allocated buffer will be too small!
So how do I know how much memory to pre-allocate when using array placement-new?
void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space); std::string* p = ::new (buffer) std::string[10]; Or does the standard somewhere guarantee that y == 0 in this case? Again, the quote says:
This overhead may be applied in all array new-expressions, including those referencing the library function
operator new[](std::size_t, void*)and other placement allocation functions.
new? I don't think it will influence performancee much because placement new is basically a no-op, and constructors for all objects in array have to be called separately anyway.operator new[]andoperator delete[]in whatever scope they are located in to deal with this extra overhead internally rather then having this overhead passed along with the minimal required space. I think that was the original intent, but if a constructor throws an exception, this can cause a problem if it's not known how many elements have been constructed. What's really missing from C++ is a way to define how to construct an array of elements.