[gcc] выделение памяти для глобальных/локальных переменных

spensnp


int main(int argc, char** argv)
{
float A[10000][10000];

A[0][0]=0;
return 0;
}

вываливается с ошибкой сегментирования

int main(int argc, char** argv)
{
float A[1000][1000];

A[0][0]=0;
return 0;
}

работает

float A[10000][10000];
int main(int argc, char** argv)
{
A[0][0]=0;
return 0;
}

работает

int main(int argc, char** argv)
{
float (*A)[10000] = new float [10000] [10000];
A[0][0]=0;
return 0;
}

работает
компилятор - gcc/g++ 4.2.0
с icc 9.1 эффект не наблюдается
это с компилятором проблемы или есть какие-то ограничения на память выделяемую для локальных переменных?

yolki

есть ограничения на стек.

banderon

компилятор - gcc/g++ 4.2.0
с icc 9.1 эффект не наблюдается
В gcc по умолчанию стоит -O0, а в icc — -O2.
Попробуй gcc с -O2 и icc с -O0
А вообще это не очень хорошая идея размещать большие массивы в стеке. В твоем случае как workaround поможет
ulimit -s unlimited

spensnp

Попробуй gcc с -O2 и icc с -O0
ситуация изменилась на прямо противоположную
если можно - пару слов о том что это все значит
почему с _выключенной_ оптимизацией программа рушится? ведь с точки зрения банальной эрудиции так быть не должно ; )
> твоем случае как workaround поможет ulimit -s unlimited
мне не принципиально статический это будет массив или динамический
просто удивительным показалось
2 , : про стек я понял. спасибо.

banderon

В linux может быть ограничение на стек (смотри вывод команды ulimit -a)
Если стек ограничен 8 мегабайтами, то создать в нем массив больше не получится, этого не позволит система, и бросит segfault.
Включение оптимизации на конретно этом коде позволит компилятору вообще нигде не выделять память, и сразу вернуть ноль.
Если без разницы, то делай динамическим/глобальным.

spensnp

В linux может быть ограничение на стек (смотри вывод команды ulimit -a)
действительно
stack size (kbytes, -s) 8192
Включение оптимизации на конретно этом коде позволит компилятору вообще нигде не выделять память, и сразу вернуть ноль.
теперь понятно. спасибо еще раз. а то я как бендер блин "это ставит под сомнение всю мою концепцию реальности" )

Ivan8209

> почему с _выключенной_ оптимизацией программа рушится?
Потому что это --- GCC 4.
Различаются даже -O3 и -O2, сильно. А ты сравниваешь...
---
"Мы диалектику учили не по Гегелю.
Бряцанием боёв она врывалась в стих..."
Оставить комментарий
Имя или ник:
Комментарий: