char buffer[1000] = {0};
这将所有 1000 个元素初始化为 0。这是常数时间吗?如果不是,为什么?
根据以下事实,编译器似乎可以将其优化为 O(1):
- 数组大小固定,编译时已知
- 该数组位于堆栈上,这意味着可执行文件可能将此数据包含在可执行文件的数据段中(在 Windows 上)作为已经填充了 0 的数据 block 。
请注意,答案对任何编译器都是通用的,但我对在 Windows 上的 MSVC 编译器(任何版本)上测试过的答案特别感兴趣。
奖励积分:非常感谢链接到有关此细节的任何文章、白皮书等。
最佳答案
如果它在函数内部,不,它不是常数时间。
您的第二个假设不正确:
“该数组位于堆栈上,这意味着可执行文件可能将此数据包含在可执行文件的数据段中(在 Windows 上)作为已经填充了 0 的数据 block 。”
堆栈尚未填满零。它充满了之前函数调用遗留下来的垃圾。
所以不可能在 O(1)
中完成它,因为它必须将它归零。
关于c++ - 在常数时间内初始化 C++ 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7718240/