C ++ - Выделение большего массива в куче - PullRequest
0 голосов
/ 03 мая 2018

Я скачал Visual Studio и запустил C ++ вчера. Я сейчас столкнулся с проблемой, хотя. У меня есть супер простая программа, которая заполняет большой массив логическими значениями, а затем подсчитывает количество истинных элементов. Теперь я хочу запустить свою программу для очень больших массивов (желательно с длинами 2 ^ 33 или 2 ^ 34). Я понял, что это создаст проблему с переполнением стека и что вместо этого я должен разместить массив в куче. Я не понимаю, как это сделать, хотя. Я также слышал, что принято использовать векторы вместо массивов, но я подумал, что они могут быть медленнее, поэтому я остановился на массивах. Что мне сделать, чтобы моя программа работала как можно быстрее для больших массивов?

void makeB(bool *a, long double length)
{
    for (long x = 0; x < sqrtl(length/2)+1; ++x)
    {
        for (long y = x; y < sqrtl(length)+1; ++y)
        {
            long int z = x * x + y * y;
            if (z < length)
            {
                a[z] = true;
            }
        }
    }
}

int main()
{
    const long length = 268435457;
    static bool a[length] = {};
    long b = 0;
    makeB(a, length);
    for (long i = 0; i < length; ++i)
    {
        if (a[i])
        {
            b += 1;
        }
    }
    printf("%ld: ", length - 1);
    printf("%ld.\n", b);

    char input;
    cin >> input;
    return 0;
}

Чтобы уточнить, я хочу иметь возможность увеличить переменную длины до больших значений без получения ошибки переполнения стека. Быстрый код также предпочтительнее. Я также в порядке с использованием векторов, если это действительно лучше. Если это прояснит причину моего замешательства, я приду с Явы.

Спасибо!

РЕДАКТИРОВАТЬ: Во-первых, я должен отметить, что действительно 2 ^ 40 это слишком много, чтобы ожидать от моей системы, на что указывают почти все, извините за это. Я чувствую, что могу ожидать, возможно, 2 ^ 33. А во-вторых, спасибо за все ответы, но каков окончательный консенсус? Должен ли я взглянуть на std :: make_unique? Еще раз спасибо!

...