首页 > 后端开发 > C++ > 放置新数组分配到底有多少开销?

放置新数组分配到底有多少开销?

Mary-Kate Olsen
发布: 2024-12-22 08:40:14
原创
247 人浏览过

How Much Overhead Does Placement-New Array Allocation Really Have?

放置新和未指定的数组分配开销

C 11 标准指定放置新表达式 new(buffer) T[5] 将导致调用到运算符 new[](sizeof(T)*5 y,buffer) 其中 x 和 y 是表示数组分配的非负、未指定值开销。

但是,在使用带有预分配缓冲区的placement-new 时,这会引起问题。如果 y 大于 0,则分配的缓冲区可能不足以容纳数组。

确定数组分配开销

由于标准不保证 y 的值,因此至关重要在运行时确定它。一种方法是创建一个自定义的 Placement-new 运算符来检查可用的缓冲区空间。

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;
}
登录后复制

通过改变数组大小并检查自定义 new 运算符中的 n,您可以推断出 y 的值

更新了标准

需要注意的是,缺陷报告已于 2019 年 11 月修复了此问题,可追溯至C 的所有版本。根据更新后的标准,operator new[](std::size_t, void* p) 的开销始终为零。

因此,在使用库函数operator new[](std::size_t, void*),您可以预先分配确切大小的缓冲区,而不必担心未指定的分配开销。

以上是放置新数组分配到底有多少开销?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板