![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Iron Bug |
![]()
Сообщение
#11
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
В какое? в сегмент данных. впрочем, может, компилятор для оптимизации их даже в сегмент кода упихивает, ибо константы не меняются, а ближние указатели быстрее. Что происходит с данными s? Как освобождается память занимаемая ими? И освобождается ли вообще? с константными строками ничего не происходит. они остаются. компилятор всё равно выделяет под них место в данных - нет смысла их удалять. во всяком случае, мне не известно о какой-либо хитрой рантайм оптимизации неиспользованных данных. а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить. если хочешь, чтобы строки не занимали место - грузи их динамически из какого-то стороннего файла. |
|
|
ilyabvt |
![]()
Сообщение
#12
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Правильно копировать так:
Не правильно. sizeof(cc) вернет размер указателя, а не массива. В данном случае это сработает только по тому что вы создали 4-х байтный массив. Цитата а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. ![]() Сообщение отредактировал ilyabvt - 22.12.2011, 17:50 |
|
|
rp80 |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
с константными строками ничего не происходит. они остаются. компилятор всё равно выделяет под них место в данных - нет смысла их удалять. во всяком случае, мне не известно о какой-либо хитрой рантайм оптимизации неиспользованных данных. а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить. если хочешь, чтобы строки не занимали место - грузи их динамически из какого-то стороннего файла. Т.е. если где-то в функции мы создаем десять строк по 100 мб, то экзешник будет 1000+ мб? Ну и правильно я понимаю, что строки это не исключение из правил? Значит значения любых базовых или пользовательских локальных переменных и массивов этих переменных сохраняются в коде? Сообщение отредактировал rp80 - 22.12.2011, 19:28 |
|
|
ilyabvt |
![]()
Сообщение
#14
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
с константными строками ничего не происходит. они остаются. компилятор всё равно выделяет под них место в данных - нет смысла их удалять. во всяком случае, мне не известно о какой-либо хитрой рантайм оптимизации неиспользованных данных. а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить. если хочешь, чтобы строки не занимали место - грузи их динамически из какого-то стороннего файла. Т.е. если где-то в функции мы создаем десять строк по 100 мб, то экзешник будет 1000+ мб? Ну и правильно я понимаю, что строки это не исключение из правил? Значит значения любых базовых или пользовательских локальных переменных и массивов этих переменных сохраняются в коде? Не забывайте что речь идет о константных строках, т.е. тех значение которых мы явно задаем в программе. Вы часто в исходнике пишете строку длинною 100 миллионов символов? Строки действительно не исключение, числа заданные явно тоже хранятся в коде. Вот например есть код:
Переменная 'а' хранится в стеке, а число 2 в коде. |
|
|
rp80 |
![]()
Сообщение
#15
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Не забывайте что речь идет о константных строках, т.е. тех значение которых мы явно задаем в программе. Вы часто в исходнике пишете строку длинною 100 миллионов символов? Строки действительно не исключение, числа заданные явно тоже хранятся в коде. Вот например есть код:
Переменная 'а' хранится в стеке, а число 2 в коде. Спасибо за пояснение. Ну есстественно, программист сам не задает такие строки. Но, например, строку в которую читают из файла размером в 100 000 000 символов представить вполне можно. Это же тоже явное задание? |
|
|
ilyabvt |
![]()
Сообщение
#16
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Не забывайте что речь идет о константных строках, т.е. тех значение которых мы явно задаем в программе. Вы часто в исходнике пишете строку длинною 100 миллионов символов? Строки действительно не исключение, числа заданные явно тоже хранятся в коде. Вот например есть код:
Переменная 'а' хранится в стеке, а число 2 в коде. Спасибо за пояснение. Ну есстественно, программист сам не задает такие строки. Но, например, строку в которую читают из файла размером в 100 000 000 символов представить вполне можно. Это же тоже явное задание? Нет конечно, мало ли что будет в этом файле (и будет ли он вообще) на момент компиляции. А потом, файл вы считываете в переменную. А речь сейчас не о них. Речь о константных данных. Явное задание это то что программист указывает в коде. |
|
|
rp80 |
![]()
Сообщение
#17
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Нет конечно, мало ли что будет в этом файле (и будет ли он вообще) на момент компиляции. А потом, файл вы считываете в переменную. А речь сейчас не о них. Речь о константных данных. Явное задание это то что программист указывает в коде. Хорошо, а где хранятся данные переменных? В самом стеке? И в примере с чтением из файла в какой-то момент будет переполнение стека, если файл достаточно большой? |
|
|
Iron Bug |
![]()
Сообщение
#18
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. ![]() нет. сегмент кода не может менять содержимое ни в одной из современных осей. это главное правило: код не может модифицировать сам себя. это только в DOSе можно было писать такие кренделя. любая защищённая система этого не позволяет. модифицировать можно исполняемый файл, например. или в отладчике писать какие-то значения в регистры. или подгружать какие-то библиотеки на ходу. но сама программа себя менять никак не может. просто нет прав на запись в сегмент кода. Хорошо, а где хранятся данные переменных? В самом стеке? И в примере с чтением из файла в какой-то момент будет переполнение стека, если файл достаточно большой? смотря каких. константы могут быть сложены в сегмент кода (раз они не меняются). переменные, которые обычные - в сегменте данных. можно ещё регистровые переменные создавать - они, соответственно, будут размещены в регистрах, если компилятор сможет их так распределить. если не сможет - то всё равно в сегменте данных. Сообщение отредактировал Iron Bug - 22.12.2011, 20:33 |
|
|
rp80 |
![]()
Сообщение
#19
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
смотря каких. константы могут быть сложены в сегмент кода (раз они не меняются). переменные, которые обычные - в сегменте данных. можно ещё регистровые переменные создавать - они, соответственно, будут размещены в регистрах, если компилятор сможет их так распределить. если не сможет - то всё равно в сегменте данных. Вообще вот цитата из википедии: A data segment is a portion of virtual address space of a program, which contains the global variables and static variables that are initialized by the programmer. Т.е. они называют сегментом данных то что вы называете сегментом кода. Непонятно кто прав.. А насчет утечек вот пример
Работает, не падает, разве это не говорит об утечке? Блок закрылся, переменная ar удалена из стека, но выделенный массив остался в памяти. И если я меняю размер массива на 10, то размер экзешника уменьшается (18693 на 18677). Т.е. похоже на то, что данные хранятся в коде. Но тогда получается что такой неявно заданный объект тоже хранит данные в сегменте кода. И везде где я читаю пишут что есть 3 типа памяти: Сегмент кода - хранит текст программы + константы и статик переменные. Стэк - хранит локальные переменные. Куча - хранит динамические переменные. Нигде не видел упоминание о сегменте данных как о 4ом виде памяти, связанном со стеком. Сообщение отредактировал rp80 - 22.12.2011, 23:25 |
|
|
Алексей1153 |
![]()
Сообщение
#20
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
rp80, стек то никуда не девается. А то, что ты правильно выводишь якобы - это уже мусор, одна ко по чистой случайности этот мусор пока ещё соответствует тому, что в него поместили внутри вложенного блока
попробуй вот так
Сообщение отредактировал Алексей1153 - 23.12.2011, 7:34 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 18.5.2025, 20:10 |