Update
Nicol Bolas correctly points out in the comments below that this has been fixed such that the overhead is always zero for operator new[](std::size_t, void* p)
.
This fix was done as a defect report in November 2019, which makes it retroactive to all versions of C++.
Original Answer
Don’t use operator new[](std::size_t, void* p)
unless you know a-priori the answer to this question. The answer is an implementation detail and can change with compiler/platform. Though it is typically stable for any given platform. E.g. this is something specified by the Itanium ABI.
If you don’t know the answer to this question, write your own placement array new that can check this at run time:
inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
if (n <= limit)
std::cout << "life is good\n";
else
throw std::bad_alloc();
return p;
}
int main()
{
alignas(std::string) char buffer[100];
std::string* p = new(buffer, sizeof(buffer)) std::string[3];
}
By varying the array size and inspecting n
in the example above, you can infer y
for your platform. For my platform y
is 1 word. The sizeof(word) varies depending on whether I’m compiling for a 32 bit or 64 bit architecture.