C++;堆分配保证算法 P>是否存在C++标准中关于非执行策略重载的标准算法不保证自由存储(即堆)分配的任何保证?

C++;堆分配保证算法 P>是否存在C++标准中关于非执行策略重载的标准算法不保证自由存储(即堆)分配的任何保证?,c++,algorithm,language-lawyer,C++,Algorithm,Language Lawyer,我正在进行实时处理,并希望使用,例如,std::max_元素,但我看不到任何关于它不在堆上分配的保证。这是有道理的,它没有,但我没有看到指定的任何地方。也许我遗漏了一些保证这一点的一般条款?我没有直接提到这种保证。但是,对于非执行策略重载,std::max_元素没有提到例外 注意,它确实提到了执行策略重载的std::bad_alloc 如果此信息正确,则这意味着非执行策略重载无法在堆上分配内存(否则它们可能抛出bad::alloc)。该标准禁止任何算法分配内存。由于了解算法是否分配内存可能有用/

我正在进行实时处理,并希望使用,例如,
std::max_元素
,但我看不到任何关于它不在堆上分配的保证。这是有道理的,它没有,但我没有看到指定的任何地方。也许我遗漏了一些保证这一点的一般条款?

我没有直接提到这种保证。但是,对于非执行策略重载,
std::max_元素
没有提到例外

注意,它确实提到了执行策略重载的
std::bad_alloc


如果此信息正确,则这意味着非执行策略重载无法在堆上分配内存(否则它们可能抛出
bad::alloc
)。

该标准禁止任何算法分配内存。由于了解算法是否分配内存可能有用/必要,因此省略本规范可能被视为一个缺陷(我认为在这个主题上没有突出的缺陷)。指定哪些算法不允许分配内存应该不会太糟糕,只要这些分配只涵盖算法自身的操作,而不是对其参数的操作:算法可能使用对象的副本,而这些副本又可能需要内存分配


理论上可以想象,一些算法可能受益于临时缓冲区,并可以分配内存。然而,实际上有一些算法可以这样做(例如,
rotate()
可以从分配内存中获益)。像
std::max_element()
这样的算法不会分配内存,尽管它没有被指定为不分配内存。

请看:甚至不能保证
操作符+(int,int)
不使用堆。为什么您希望对更复杂的算法有这样的保证?它仍然可以
尝试catch
,然后返回到不分配的实现;-)@Jarod42嗯,是的,错过了。然而,这将是一种令人讨厌的做法,我希望没有实现,因为没有关于标准非执行策略算法的异常说明,这一事实正式意味着它们不允许抛出异常?@Danra无论如何,唯一100%可信的参考是标准,CPPPreference是相当可靠的,但如果您需要100%的保证……也请注意Jarods的评论。我的推理有一个严重的缺陷,因为即使该方法不抛出,内部也可能存在异常。我留下答案是因为没有其他答案,也许我会删除它。对于某些算法(
std::inplace\u merge
),如果临时存储(即堆存储)可用,复杂性要求会明显改变。假设临时存储是std::get_temporary_buffer的主要角色@PeteBecker:同意。但是,
std::max_element()
不太可能需要额外的内存。如果规范更严格,明确禁止使用额外内存,这将是一件好事,但由于没有做到这一点,目前最好的做法是做出合理的假设(或不使用算法)。