我想更多地使用标准算法,但对控制内存分配有一些非常严格的要求。
是否有分配的算法的全面列表?
另外,无论如何都要控制这种分配的发生方式?是否覆盖全球新的唯一选择?如果静态链接,这实际上有用吗?
在C ++ 17之前,似乎所有分配都通过std :: get_temporary_buffer()来分配内存,但这在C ++ 17中似乎已被弃用。是什么取代了这个?
答案 0 :(得分:2)
AFAIR标准算法中没有一个会分配内存,除非:
std::back_insert_iterator<>
校正:
以下算法使用它:
现实情况似乎是libstdc ++的实现只是尝试使用T::operator new
分配缓冲区,如果new
调用返回null,则将分配大小减半,直到分配大小为零。
template<typename _Tp>
pair<_Tp*, ptrdiff_t>
__get_temporary_buffer(ptrdiff_t __len, _Tp*)
{
const ptrdiff_t __max = numeric_limits<ptrdiff_t>::max() / sizeof(_Tp);
if (__len > __max)
__len = __max;
while (__len > 0)
{
_Tp* __tmp = static_cast<_Tp*>(::operator new(__len * sizeof(_Tp),
nothrow));
if (__tmp != 0)
return pair<_Tp*, ptrdiff_t>(__tmp, __len);
__len /= 2;
}
return pair<_Tp*, ptrdiff_t>(static_cast<_Tp*>(0), 0);
}
来源:https://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.0/memory-source.html
事实证明,这个功能是有争议的,因为STL的原作者亚历山大·斯捷潘诺夫(Alexander Stepanov)将此作为占位符实现,并留下文档,表明它不应该投入生产。
毋庸置疑,它确实存在,并且自那以后一直存在于STL的每个端口。
答案 1 :(得分:1)
对于非并行算法,stable_partition
,stable_sort
和inplace_merge
是肯定会尝试获取额外内存的三种算法,如果它可以&返回到效率较低的算法#39; t这样做。他们是如何确切地尝试获取内存的。
但是,标准中没有任何内容表明其他算法无法尝试分配内存而只是为了它。高质量的实现不应该,但如果你真的需要它不分配,你应该自己检查实现。
答案 2 :(得分:0)
看起来控制分配的唯一方法是重写全局新内容。请参阅此处,第34节;全球替换&#34;
http://en.cppreference.com/w/cpp/memory/new/operator_new
由于这在链接时起作用,这意味着每个dll必须链接翻译单元和重写的全局新/删除。如何映射到任何特定的分配策略可能超出了这个问题的范围。
此处的其他答案指定了哪些算法尝试使用临时值。
stable_partition,stable_sort和inplace_merge