首页 >后端开发 >C++ >C 11 数组放置新表达式会产生哪些未指定的开销?

C 11 数组放置新表达式会产生哪些未指定的开销?

DDD
DDD原创
2024-12-13 19:07:14425浏览

What Unspecified Overhead Do C  11 Array Placement-New Expressions Incur?

缓冲区中的数组放置新开销

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn