最近的C++标准中有没有内存分配操作的复杂度保证呢?也就是说,如果我有一个类A,它的默认构造函数和析构函数的运行时间是O(1),那么"new A[N]"和"delete[] A"的时间复杂度是什么?是否有任何关于"new int[N]"的复杂度保证呢?
最近的C++标准中有没有内存分配操作的复杂度保证呢?也就是说,如果我有一个类A,它的默认构造函数和析构函数的运行时间是O(1),那么"new A[N]"和"delete[] A"的时间复杂度是什么?是否有任何关于"new int[N]"的复杂度保证呢?
我怀疑是否有任何确切的保证,因为太多取决于平台(想象一下一些非常奇怪的理论平台,没有人会制造但可能存在)。然而,您可以做出某些预测。如果构建和删除需要 O(1)
那么...
delete A[]
的大小为 n
,取决于 A
是否是平凡可销毁的或需要非平凡的删除过程,其时间复杂度为 O(1)
或 O(n)
。实际上,O(1)
可能很大(不是真正的 O(1)
),因为释放一大块连续内存可能需要一点时间,但在更大的范围内仍然微不足道。
对于 new A[n]
也是如此。如果 A
是平凡可构造的(例如 int
,即允许垃圾数据),则可能需要约(虚假)O(1)
,否则每个元素都需要一些 O(1)
处理,时间复杂度为 O(n)
。
通常,您不应忘记当 A
的构建和销毁缓慢时,可能需要大量时间。
A
是可平凡析构的,delete A[]
的时间复杂度也可能是O(N)。比如系统为了安全起见会清空已释放内存,或者需要更新页表项等等。您是否在断言这种情况违反了标准? - Nate Eldredge
new
的时间复杂度会低于 O(N),因为例如操作系统可能需要在分配给你之前清零内存。 - Nate Eldredge