给定一个数字X并将X个数字读入一维数组,以下哪种方法最好(执行时间最快)?
请注意,X 是 1 到 1000000 之间的数字
scanf("%d", &x);
int array[x];
//continue reading X numbers into array
或者
scanf("%d", &x);
int array[1000000];
//continue reading X ...
或者
scanf("%d", &x);
int * array = malloc(x*sizeof(int));
//same as above
free(array);
还是C++动态分配方法?
注1:我是从手机上发布的,我希望上面代码的格式没问题,如果没有,我请好心人(<3)编辑它,因为缩进代码很痛苦一部电话。
注 2:如何测试我上面提出的问题?
最佳答案
由于出现了 scanf
(并且注释假设还有一百万次对 scanf
的调用),因此任何有关内存分配的问题以及“哪个最快?”可以普遍回答:"is"(读作:不相关)。
虽然自动存储(“堆栈分配”)通常比 freestore 更快,但与您在 scanf
中花费的时间相比,它完全微不足道。话虽如此,通常(不一定,但通常)动态释放速度很慢,而不是分配。
关于该代码一般需要注意的几点:
- 从某些外部源(文件、网络、argv 等)读取整数并根据该数字进行分配而不首先进行健全性检查是非常糟糕的业力。这有一天必然会引起一个问题,那就是现实世界中有多少现有的漏洞利用程序应运而生。不要盲目相信您从某处获得的任何号码都是自动有效的。即使没有恶意,意外仍然可能提供无效的号码,从而导致灾难性的失败。
- 在堆栈上分配非常量大小的数组可以在最新版本的 C 下工作,并且如果您使用 GCC,即使在 C++ 下也可以作为扩展“工作”,但在 C++ 中通常是不允许的(意味着它将无法编译)。
- 分配一百万个整数意味着大约 4MB 内存,这对于最大堆栈大小(通常只有 1MB)来说非常苛刻。 预计会发生堆栈溢出。
- 分配未知数量的整数(但预计数量最多为一百万)类似于 (3)。
- 关于(3)和(4)的最糟糕的事情是它实际上可能会成功。这可能意味着您的程序稍后会在完全不相关的无辜代码中意外崩溃(遇到堆栈溢出)。您会想知道为什么会发生这种情况,因为崩溃的代码看起来完全有效(确实如此!)。
关于c++ - C/C++ 分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36303529/