gpt4 book ai didi

c++ - C++ 标准库中是否有保证不执行动态内存分配的函数或类?

转载 作者:行者123 更新时间:2023-11-30 02:17:01 25 4
gpt4 key购买 nike

在某些情况下,我们希望我们的 C++ 代码不执行动态内存分配(“在堆上”),特别是在某些嵌入式开发用例中。

有一些标准库类可以在没有动态内存分配的情况下实现:optional、array、tuple、variant 等等。标准库自由函数也是如此。

是否有标准保证不动态分配内存的类或函数?我能找到的具有这种保证的唯一函数是放置 new() 函数。

最佳答案

C++ 标准很少直接保证不使用动态内存。

在动态内存分配是信号不安全的系统上,您可以确定所有列为信号安全的函数都是非分配的。标准提到

_Exit
abort
forward
initializer_list functions
memcpy
memmove
move
move_if_noexcept
numeric_limits members
quick_exit
signal
type traits
plain lock-free atomic operations

如果您可以假设符合另一个标准 POSIX,那么它会列出更多的函数 async-signal-safe . POSIX 列出的其中一些函数也由 C++(和 C)标准提供(例如 strcat),因此这些标准 C++ 函数在所有 POSIX 系统上都是信号安全的。

[new.delete.placement] 中有一些函数根据定义是非分配的。


另一个与保证不同的问题是,函数或类型的合理实现是否不会分配。许多很多东西,例如 std::tuplestd::array(自然具有非分配类型参数)都属于这一类。

声明为 noexcept 且没有任何失败路径(如设置错误代码、返回错误指示值或终止进程)的函数不应该分配是合理的,因为分配可能会抛出。

相反,有些函数在合理的实现中会分配动态内存。显然那些涉及分配器的,以及那些在 SO post 中列出的你链接的。列表中缺少一个经常咬人编写信号处理程序的不明显的:期望 printf 或其任何相关函数不分配是完全不合理的。

关于c++ - C++ 标准库中是否有保证不执行动态内存分配的函数或类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54100210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com