繁体   English   中英

C/C++ 分配

[英]C/C++ Allocation

给出一个数字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("%d", &x);
int array[x];

在这种情况下,应该在编译时知道 x。

使用int array[1000000]您在堆栈上分配内存,而不是在堆中,因此与mallocnew operator相比,这是根本区别。 它会更快,因为它实际上只需要一个 CPU 命令来修改堆栈指针。

如果比较mallocnewmalloc会更快,因为 new 最终会在内部调用malloc 但是性能提升会很小,用这种方式优化你的c++程序是不值得的,只需要在需要分配动态内存时使用c++。

由于出现scanf (并且评论假设还有一百万次调用scanf )关于内存分配以及“哪个最快?”的任何问题。 可以普遍回答:“是”(读作:无关紧要)。

虽然自动存储(“堆栈分配”)通常比 freestore 快,但与您将在scanf花费的时间相比,它完全微不足道。 话虽如此,它通常(不一定,但通常)是缓慢的动态释放,而不是分配。

关于该代码,一般需要注意几点:

  1. 从某个外部源(文件、网络、argv 等)读取一个整数并根据该数字进行分配而不先进行完整性检查是非常糟糕的业力。 这总有一天会引起一个问题,那就是有多少现有的现实世界的漏洞应运而生。 不要盲目相信您从某处获得的任何号码都是自动有效的。 即使没有恶意,事故仍然可能提供一个无效的数字,这将导致灾难性的故障。
  2. 在堆栈上分配一个非常量大小的数组将在最新版本的 C 下工作,并且如果您使用 GCC,即使在 C++ 下也可以作为扩展“工作”,但在 C++ 中通常是不允许的(这意味着它将无法编译)。
  3. 分配一百万个整数意味着大约 4MB 的内存,这对您的最大堆栈大小(通常只有 1MB)来说非常苛刻。 预计会发生堆栈溢出
  4. 分配未知数量的整数(但预计数量最多可达一百万)类似于(3)。
  5. re (3) 和 (4) 最糟糕的是它实际上可能会成功 这可能意味着您的程序稍后会意外崩溃(遇到堆栈溢出),在一段完全无关的无辜代码中。 您会想知道为什么会发生这种情况,因为崩溃的代码看起来完全有效(而且确实如此!)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM