首页 > 后端开发 > C++ > C 放置新数组确实需要多少缓冲区空间?

C 放置新数组确实需要多少缓冲区空间?

DDD
发布: 2024-12-29 06:37:09
原创
512 人浏览过

How Much Buffer Space is Really Needed for C   Placement-New Arrays?

数组放置新:了解未指定开销的影响

C 标准要求数组放置新表达式可能会产生未指定的开销分配的缓冲区。由变量 x 和 y 表示的开销在 new 的不同调用之间可能会有所不同。

考虑示例代码:

void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
登录后复制

根据标准,placement-new 表达式 new ( buffer) std::string[10] 将在内部调用operator new[](sizeof(std::string) * 10 y,

但是,这引起了一个问题:如果 y 大于 0,则预分配的缓冲区 buffer 可能太小,导致运行时错误。

如何确定所需的缓冲区大小

标准不保证 y 始终为 0。要确保预先分配的缓冲区就足够了,您可以手动计算所需的额外开销。不幸的是,这需要了解特定于平台的实现细节。

替代方案:与实现无关的方法

为了避免依赖特定于实现的知识,您可以使用自己的放置数组新实现,用于检查运行时的开销:

inline
void*
operator new[](std::size_t n, void* p, std::size_t limit)
{
    if (n <= limit)
        std::cout << &quot;life is good\n&quot;;
    else
        throw std::bad_alloc();
    return p;
}
登录后复制

通过改变数组大小并检查示例中的 n如上所述,您可以推断出特定平台的 y 值。

更新:消除开销

Nicol Bolas 强调指出,截至 2019 年 11 月,缺陷报告修复了此问题,确保运算符 new[](std::size_t, void* p) 的 y 始终为 0。此更改追溯适用于 C 的所有版本。因此,不再需要开销估算。

以上是C 放置新数组确实需要多少缓冲区空间?的详细内容。更多信息请关注PHP中文网其他相关文章!

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