在恒定时间内初始化C++数组

voi*_*ter 1 c++ visual-c++

char buffer[1000] = {0};
Run Code Online (Sandbox Code Playgroud)

这会将所有1000个元素初始化为0.这是不变的时间吗?如果没有,为什么?

似乎编译器可以根据以下事实将其优化为O(1):

  1. 该数组具有固定大小,在编译时已知
  2. 该数组位于堆栈上,这意味着可执行文件可能在可执行文件的数据段(在Windows上)中包含此数据,作为已填充0的数据块.

请注意,答案对于任何编译器都是通用的,但我特别感兴趣的是在Windows上的MSVC编译器(任何版本)上测试的答案.

奖励积分:关于此细节的任何文章,白皮书等的链接将不胜感激.

Mys*_*ial 8

如果它在一个函数内部,不,它不是恒定的时间.

你的第二个假设是不正确的:

"数组位于堆栈上,这意味着可执行文件可能包含可执行文件数据段(在Windows上)中的这些数据,作为已填充0的数据块."

堆栈尚未填充零.它充满了以前函数调用的垃圾剩余.

所以不可能这样做,O(1)因为它必须将其归零.


Al *_*epp 6

它可以是O(1)仅作为全局变量.如果它是局部变量(在堆栈上),则为O(n),其中n是数组的大小.

堆栈是一个共享内存,你需要主动为零,总是希望在那里有1000个零.您定义的数组未实现为指向数据段的指针,它是堆栈上的1000个变量,必须在O(1000)中初始化.

编辑:Dani是对的,我必须修改我的声明:如果它是一个全局数组,它会在程序启动时初始化.它也是O(n).