Size: a a a

2021 February 07

SK

Stas Koynov in Qt
Aleksandr Drobyshev
Хм... я просто когда сел за Qt(и С++ соотв.) посмотрел курс по С++ от одного товарища, где он строго-настрого завещал всегда использовать динамические переменные,одна из причин того- чтоб располагать их в куче(т.е. где-то в оперативке) а не на стеке ОС.
Я везде теперь их пользую, просто напрягает везде разименовывать указатели, чтоб в них чет записать.
Потому и спросил.
Может кто подскажет где почитать именно про этот вопрос, про расположение переменных на стеке или куче, в реальных ПК, под реальными ОС, и как лучше делать.
Ну вот тебе пример: в ядре Linux внутри драйвера у тебя есть стэк. равный одной странице по дефолту, ты можешь это поменять в настройках ядра при сборке вроде как. Одна страница 4КиБ. вопрос как долго ты можешь делать вложенные вызовы функции? как долго ты будешь делать рекурсивный вызов? ну это же бред для драйвера ядра этоже бред... ну бред да. но сколько можно сделать вызовов если у тебя на стеке будет массив в 1000 интов? упс кернел паник.
Теперь загугли размер стека потока виндовс 1МБ и 16КиБ для ядра. Его можно увеличить там при старте CreateThread и все такое...
Вот теперь выдели на стеке массив интов в 1 мегабайт и посмотри что тебе скажет винда!
Вот ты говоришь, что пришел из микроконтроллеров. тогда я не понимаю, к чему такие вопросы, там ты по краю ходил почти всегда!. если брать вообще жуткий стыд аля Пик 12 то там стэк на 4 инта вот там вообще асм и гоуту.
источник

SK

Stas Koynov in Qt
но как выше сказали, скатываться на int* или дабл, вместо передачи параметров, ну это уже стыд в квадрате.
источник

МС

Михаил Серебренников... in Qt
Кстати, фишка указателей на элементарные типы в том, что они не экономят стек. ))
Т.к. указатель - это 64 бит (для современных ПК и ОС).
источник

SK

Stas Koynov in Qt
Михаил Серебренников
Кстати, фишка указателей на элементарные типы в том, что они не экономят стек. ))
Т.к. указатель - это 64 бит (для современных ПК и ОС).
угу! + лишний мув ибо сразу данных нет, они где-то..
источник

МС

Михаил Серебренников... in Qt
Ну а массив int тот же, если используешь, как заведено в C++, std::vector будет выделяться в куче. Так что даже думать об этом не надо.
источник

AS

Anatoly Shirokov in Qt
Если близок ассемблер, то смысл указателя будет понятен если упомянуть о косвенной адресации. Указатель - это такой же полноценный тип, как и инт, только значением его является адрес.
источник

SK

Stas Koynov in Qt
Михаил Серебренников
Ну а массив int тот же, если используешь, как заведено в C++, std::vector будет выделяться в куче. Так что даже думать об этом не надо.
Кстати да топикстартер, я тебе говорил, про старый добрый Сишный масивчик. тобишь
 int arr[1024*1024];
источник

МС

Михаил Серебренников... in Qt
Ну это понятно. )
источник

AS

Anatoly Shirokov in Qt
В Си автор посчитал, что если позволить передавать массив по значению, то это переполнит стек, поэтому сделали массив недообъектом, который нельзя передавать по значению.
источник

AS

Anatoly Shirokov in Qt
и вместо массива всегда передается указатель на его первый элемент
источник

МС

Михаил Серебренников... in Qt
Ладно. Думаю, Александр понял, что в C++ в 99% случаях не стоит парится насчёт стека.
источник

AD

Aleksandr Drobyshev in Qt
Михаил Серебренников
Знаю одну реальную страшилку. )
В ОС реального времени если приложение завершится и не все указатели освободятся, то эта память уже не будет доступна для других приложений до перезагрузки ОС. )))
Окак... а сам Qt пользовательские переменные не удаляет по завершению программы?
источник

AS

Anatoly Shirokov in Qt
Так или иначе Александр будет писать форму, где данные можно разместить в полноценной структуре и сделать ее датамембером, включенным в форму или разместить на стеке и передать через указатель как параметр конструктора формы
источник

МС

Михаил Серебренников... in Qt
Aleksandr Drobyshev
Окак... а сам Qt пользовательские переменные не удаляет по завершению программы?
Так. На Realtime OS даже не компилится. Так что не парься.
источник

SK

Stas Koynov in Qt
Aleksandr Drobyshev
Окак... а сам Qt пользовательские переменные не удаляет по завершению программы?
Он про РТОСь говорил, где нет MMU а есть на крайний случай MPU. из-за чего когда память утекла то все шабаш ее нету. У тебя же Норм ОСь с ММУ и при закрытии процесса, вся память будет возвращена ОСи.
источник

AS

Anatoly Shirokov in Qt
Мы скатываем в оффтоп
источник

AD

Aleksandr Drobyshev in Qt
Stas Koynov
Ну вот тебе пример: в ядре Linux внутри драйвера у тебя есть стэк. равный одной странице по дефолту, ты можешь это поменять в настройках ядра при сборке вроде как. Одна страница 4КиБ. вопрос как долго ты можешь делать вложенные вызовы функции? как долго ты будешь делать рекурсивный вызов? ну это же бред для драйвера ядра этоже бред... ну бред да. но сколько можно сделать вызовов если у тебя на стеке будет массив в 1000 интов? упс кернел паник.
Теперь загугли размер стека потока виндовс 1МБ и 16КиБ для ядра. Его можно увеличить там при старте CreateThread и все такое...
Вот теперь выдели на стеке массив интов в 1 мегабайт и посмотри что тебе скажет винда!
Вот ты говоришь, что пришел из микроконтроллеров. тогда я не понимаю, к чему такие вопросы, там ты по краю ходил почти всегда!. если брать вообще жуткий стыд аля Пик 12 то там стэк на 4 инта вот там вообще асм и гоуту.
Большую часть текста не понял, начал понимать только начиная с "микроконтроллеров" )))
ну вот, страх-то остался))) Хоть с АСМа быстро перескочил на С, ибо для первого я слишком "деревянный".
источник

AS

Anatoly Shirokov in Qt
Итого, по основам языка С++ @supapro
источник

AS

Anatoly Shirokov in Qt
По вопросам Qt: @qt_chat
источник

МС

Михаил Серебренников... in Qt
Михаил Серебренников
Так. На Realtime OS даже не компилится. Так что не парься.
Хотя вру. Blackberry 10 же был RTOS.
источник