【问题标题】:Max array size using #define [duplicate]使用#define的最大数组大小[重复]
【发布时间】:2012-12-20 08:53:48
【问题描述】:

可能重复:
stack overflow c++

我有以下生成素数的程序:

#include<iostream> 
#include<cmath>
#include<algorithm>

#define MAX 10000000
using namespace std;

int main(int argc, const char *argv[])
{
    bool prime[MAX+1];
    fill_n(prime,MAX+1,true);
    int baseSqrt,i,j;
    baseSqrt = int(sqrt(MAX+1));
    for(i=2;i<=baseSqrt;i++){
        if(prime[i]){
            for(j=i+i;j<=MAX;j+=i){
                    prime[j]=false;
            }   
        }   
    }   
    return 0;
}

对于 MAX 值 = 1000000,该程序运行良好。但是当我将值增加到 10000000 时,程序会出现段错误。我尝试使用 gdb,但它停止在 main 那里给出段错误。我使用的是 64 位操作系统。即使我删除 MAX 并写 10000000 而不是 MAX,我也会得到同样的错误。我哪里错了?请帮忙。

【问题讨论】:

  • 与您可以使用的内存总量相比,堆栈的大小通常非常有限。

标签: c++ arrays segmentation-fault c-preprocessor


【解决方案1】:

您不应该将非常大的数组声明为局部变量(即在堆栈上),因为堆栈大小通常非常有限。相反,使用new[]delete[] 动态分配它们。或者对于惯用的 C++,使用像 std::deque 这样的容器类。

【讨论】:

  • 我可以使用的最大尺寸是多少?是1MB左右吗?因为使用#define MAX 7000000 程序可以正常工作
  • 为什么是new[]delete[]?为什么不std::vector
  • @Nawaz:为什么是std::vector?为什么不std::deque
  • @Tim:这也行。然而重点是:避免使用newdelete
  • @ShehbazJaffer,在您进行测量之前,您无法绝对确定每种情况,并且您不应该在必须测量之前进行测量。在过早优化之前担心工作代码。
【解决方案2】:

在这种特殊情况下,将“prime”设为全局变量不是一个合理的想法吗?我确实理解全局变量并不总是一个好的解决方案,但对于这种特殊情况,这将是一个相当明显的解决方案。并不是说 MAX 不是一个常数,所以使用 new/delete 或 vector 作为解决方案似乎有点不必要。

并回答“如果使用'new'与全局变量是否更慢'的问题,那么我可以说这可能是无关紧要的。我在上面的代码中使用了#define MAX 1000000000,将prime移动为全局变量,并且使用时间运行它,然后将代码更改为使用 new/delete,它花了大约 0.5 秒的时间——但整体运行时间是 20.4 或 20.9 秒,所以它大约是总运行时间的 2%,我很确定更多通过做其他事情可以获得超过2%的收益。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2016-07-31
    • 2015-08-22
    • 2021-06-12
    • 1970-01-01
    • 2012-09-11
    相关资源
    最近更新 更多