Создаю обычный массив: int a[3'000'000] = {0};
Компилирую командой g++ -o main main.cpp && ./main
В итоге получаю " ошибка сегментирования " , хотя раньше и 100 и 200 миллионов работало и ошибки сегментирования было. В чем проблема ?
Ошибки сегментирования нету и все работает с размером массива 900 000 000 , когда компилирую с флагом -O3 , или когда пишу так static int a[900'000'000] = {0};
Перезагрузка не помогает.
Переустановка компилятора не помогла.
Раньше работало
( кроме iostream ничего не подключено )
Александр Ананьев, Ошибки сегментирования нету и все работает с размером массива 900 000 000 , когда компилирую с флагом -O3 , или когда пишу так static int a[900'000'000] = {0};
kaktak255, -o3 всё ещё может удалять этот массив, так как после присваивания к нему никаких обращений нет.
А static всё ещё выделять память будет в куче, а не в стеке
Василий Банников,
" -o3 всё ещё может удалять этот массив, так как после присваивания к нему никаких обращений нет. "
Почему нету, ему в цикле присваивается значение X
присваивается, но не читается.
Раз не читается, значит ни на что значение не влияет.
Раз значение ни на что не влияет, значит присваивание можно заменить на no-op, а саму переменную удалить к херам.
" Это в принципе не валидный синтаксис плюсов - не надо его тут использовать. "
С ними лучше большие числа читаются.
(погуглил) https://docs.microsoft.com/ru-ru/cpp/cpp/numeric-b...
Разделители цифр: вы можете использовать одинарный символ кавычки (апостроф) для разделения значений в больших числах, чтобы упростить чтение. Разделители не влияют на компиляцию. long long i = 24'847'458'121
Василий Банников, Добавь в ответ команду компиляции для linux -fsplit-stack
с ней стек увеличивается (хз на сколько) и все работает как надо. Добавь крч, может пригодится кому.
kaktak255, ни у кого не создаются, тебе уже 20 раз в разных формулировках сказали:
1. На стеке больше определённого размера в принципе ничего не получится держать - стек порвётся при запуске программы и всё.
2. В куче тоже нельзя держать больше данных, чем там есть непрерывно места - произойдёт OOM либо segfault
3. -O3 абсолютно легально может удалять тот код, который по его мнению лишний, что ты можешь наблюдать, если посмотришь в листинг.
Какую задачу вы пытаетесь решить при помощи такого большого массива?
Василий Банников, Все работает с этой командой, оптимизацию не использую, запускаю на линуксе с g++ и все компилируется работает, массив создается и читается. Без команды которая увеличивает стек программы -fsplit-stack происходит ошибка сегментации.
В моем случае эта команда все решила, думаю и решит для остальных пользователей линукс.
size_t size = 500'000'000;
int array[size] = {0};
for(int x = 0; x < size ; ++x)
{
array[x] = x;
if((x % 1'000'000) == 1 )
cout << array[x] << endl; // тут читается
}
Василий Банников, " Какую задачу вы пытаетесь решить при помощи такого большого массива? "
Просто экспериментирую. Кстати заметил что обычный массив быстрее динамического
kaktak255, только из-за того что он на стеке и не нужно по указателям ходить.
Но в большинстве случаев это тебе большого выигрыша не даст, да и не везде его можно использовать