标准算法库中的哪些算法分配,有没有办法指定这种分配的发生方式?

时间:2017-10-12 16:33:24

标签: c++ memory stl c++17 stl-algorithm

我想更多地使用标准算法,但对控制内存分配有一些非常严格的要求。

是否有分配的算法的全面列表?
另外,无论如何都要控制这种分配的发生方式?是否覆盖全球新的唯一选择?如果静态链接,这实际上有用吗? 在C ++ 17之前,似乎所有分配都通过std :: get_temporary_buffer()来分配内存,但这在C ++ 17中似乎已被弃用。是什么取代了这个?

3 个答案:

答案 0 :(得分:2)

AFAIR标准算法中没有一个会分配内存,除非:

  1. 您的用户定义类型在复制或移动期间分配内存,或
  2. 您的输出迭代器在赋值时分配内存 - 例如std::back_insert_iterator<>
  3. 校正:

    以下算法使用它:

    • stable_partition
    • inplace_merge
    • stable_sort

    现实情况似乎是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_partitionstable_sortinplace_merge是肯定会尝试获取额外内存的三种算法,如果它可以&返回到效率较低的算法#39; t这样做。他们是如何确切地尝试获取内存的。

但是,标准中没有任何内容表明其他算法无法尝试分配内存而只是为了它。高质量的实现不应该,但如果你真的需要它不分配,你应该自己检查实现。

答案 2 :(得分:0)

看起来控制分配的唯一方法是重写全局新内容。请参阅此处,第34节;全球替换&#34;

http://en.cppreference.com/w/cpp/memory/new/operator_new

由于这在链接时起作用,这意味着每个dll必须链接翻译单元和重写的全局新/删除。如何映射到任何特定的分配策略可能超出了这个问题的范围。

此处的其他答案指定了哪些算法尝试使用临时值。

stable_partition,stable_sort和inplace_merge