C 11 规范规定所有数组 new 表达式可能会产生未指定的开销,包括那些引用库函数的开销operator new[](std::size_t, void*) 和其他布局分配函数。此开销可能会因每次调用 new 而异。
考虑以下示例:
void* buffer = malloc(sizeof(std::string) * 10); std::string* p = ::new (buffer) std::string[10];
根据规范,new (buffer) std::string[10] 将调用运算符 new[ ](sizeof(std::string) * 10 y, buffer),其中 y 是未指定的非负开销值。如果y> 0,预分配的缓冲区将不足。
无法根据标准精确确定 y 开销值。因此,除非您对平台的实现有具体了解,否则不建议使用operator new[](std::size_t, void* p)。
如果您需要使用数组placement-new和pre - 分配的缓冲区,您可以创建自己的放置数组新函数来动态检查开销:
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]; }
通过改变数组大小并检查 n 值,您可以推断出y 平台的开销。
以上是C 11 数组放置新表达式会产生哪些未指定的开销?的详细内容。更多信息请关注PHP中文网其他相关文章!