Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
Добрый день. Прошу меня простить если вопрос банален, но мне не удалось нагуглить четкий ответ, хоть эта тема и поднималась часто как в книгах так и на форумах. Ниже я привожу свои рассуждения и хочу спросить правильны ли они: Код: plaintext 1. 2. 3. 4. программа резервирует три блока памяти и каждый блок содержит константы типа char(см. код выше); каждый раз переменной name присваивается адрес первого байта нового выделенного блока; вся память остается зарезервированной до конца выполнения программы; этот код плохой, так как напрасно расходуется память (тем более если предположить что он вызывается где-то в цикле) Если мои рассуждения верны, тогда возникает следующий вопрос: Допустим есть класс MyString Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Каждый раз когда я буду присваивать обьекту класса mystring значение литерала подобным образом (см.ниже) , память выделенная на строковой литерал будет оставаться зарезервированной до конца программы, то есть это будет не лучше чем первый кусок кода. Код: plaintext 1. 2. 3. Конечно для класса MyString можно определить разные удобные методы и операторы, но будет ли оправданным использование обьектов этого класса? Или же как делетнуть память на литерал, ведь может быть вариант когда присваивается значение переменной типа char[]. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 00:22 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauпрограмма резервирует три блока памятиНет. Не программа. stud_nauэтот код плохой, так как напрасно расходуется память (тем более если предположить что он вызывается где-то в цикле)Вывод не правильный по причине предыдущего "нет". Остальные рассуждения верны. stud_nauКаждый раз когда я буду присваивать обьекту класса mystring значение литерала подобным образом (см.ниже) , память выделенная на строковой литерал будет оставаться зарезервированной до конца программы, то есть это будет не лучше чем первый кусок кода. Нет. Это будет хуже. В первом коде ты перенаправляешь указатель. Во втором манипулирешь кучей. stud_nauИли же как делетнуть память на литералНикак. Константы программе почти не подвластны. Если ты не хочешь хранить подобные строки в тексте программы - подгружай их из файла по мере необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 00:54 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
White Owl, спасибо за ответ! White Owlstud_nauпрограмма резервирует три блока памяти Нет. Не программа. stud_nauэтот код плохой, так как напрасно расходуется память (тем более если предположить что он вызывается где-то в цикле) Вывод не правильный по причине предыдущего "нет". Остальные рассуждения верны. объясните подробнее плиз, .. память расходуется каждый раз на новый литерал , правильно? White Owlstud_nauКаждый раз когда я буду присваивать обьекту класса mystring значение литерала подобным образом (см.ниже) , память выделенная на строковой литерал будет оставаться зарезервированной до конца программы, то есть это будет не лучше чем первый кусок кода. Нет. Это будет хуже. В первом коде ты перенаправляешь указатель. Во втором манипулирешь кучей. хуже потому что выделяю дополнительно память, в которую копирую литерал? оправдано ли создание и использование такого класса если в нем много удобных методов и перегруженных операторов ? А в стандартном классе (string.h) при присваивании типа x = "строка" , тоже память на литералы расходуется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 01:18 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
Компиляторы "хитрые" и не выделяют дважды память под одну и туже константную строку. Посмотри реальные адреса куда указывают твои указатели Вот тест Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Результатaaa at 0041574C bbb at 00415748 aaa at 0041574C bbb at 00415748 Как видно из результата выделяется минимально необходимое количество памяти, поэтому нет смысла проводить самодельную оптимизацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 06:35 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauобъясните подробнее плиз, .. память расходуется каждый раз на новый литерал , правильно?Нет. Нету никаких "новых" литералов. Представь себе город с улицами. Я тебе даю бумажку с адресом. Ты идешь по этому адресу и что-то делаешь. Потом я тебе даю новую бумажку с адресом... Ты каждый раз при этом будешь строить новую улицу или пойдешь на существующую улицу? Этот город - память компьютера, улицы - литералы, бумажка с адресом - указатель, а ты - программа. stud_nauхуже потому что выделяю дополнительно память, в которую копирую литерал?Нет. Хуже потому что в первом случае ты просто записывал новый адрес в четырех-байтовую переменную - единственная атомарная операция. А во втором у тебя два цикла переменной длины плюс манипуляция кучей. stud_nauоправдано ли создание и использование такого класса если в нем много удобных методов и перегруженных операторов ?Иногда да, иногда нет. stud_nauА в стандартном классе (string.h) при присваивании типа x = "строка" , тоже память на литералы расходуется?string.h это вообще не класс. Вообще, тебе сильно не стоит браться за C++ пока. Возьми простой Си и попытайся понять как он работает. После этого пойдешь в кресты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 07:45 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nau память расходуется каждый раз на новый литерал , правильно? Когда делаете char* STR="We Will Rock You"; Компилятор, во время создания бинарника, пихает эту строку в сегмент данных исполняемого файла, который при загрузке программы на исполнение, переносится в сегмент данных программы в RAM. А в стандартном классе (string.h) при присваивании типа x = "строка" , тоже память на литералы расходуется? Если имели ввиду std::basic_string, то это не из string.h, копайте отсюда <string>. И в случае с std::string, для размещения памяти под "строка" в конструкторе указатель на память запрашивается у размещённого в std::string Allocator, который оформлен как структура в составе класса basic_string, и который по умолчанию инициализируется классом std::allocator. Управление передаётся интерфейсной функци аллокатора-allocate, которая возвращает указатель на область памяти и куда std::string переносит байты строки. В std::allocator::allocate функция просто делает ::new, то есть запрашивает из кучи, и возвращает указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 11:05 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
Спасибо всем за ответы но мне не все понятно, поэтому задам вопрос немного по другому. Следующие строки : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Дают такой результат: Код: plaintext 1. 2. 3. 4. Так вот, блоки памяти (012C783C,012C783C+1,012C783C+2,012C783C+3) и (012C7838,012C7838+1,012C7838+2,012C7838+3) доступны для других программ во время выполнения текущей программы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 14:41 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauТак вот, блоки памяти (012C783C,012C783C+1,012C783C+2,012C783C+3) и (012C7838,012C7838+1,012C7838+2,012C7838+3) доступны для других программ во время выполнения текущей программы? Почитай про устройство виртуальной памяти. Тут например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:11 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauТак вот, блоки памяти (012C783C,012C783C+1,012C783C+2,012C783C+3) и (012C7838,012C7838+1,012C7838+2,012C7838+3) доступны для других программ во время выполнения текущей программы? Для другого процесса, нет. Но можно оформить блок как IPC shared memory, тогда к нему можно будет получать доступ с любого другого процесса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:18 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
Dima T, почитал, но ответ на свой вопрос я там не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:24 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
luislom, то есть при таком присвоении литералов все таки расходуется память,...я понимаю что в данном случае это очень мало, но все таки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:29 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauDima T, почитал, но ответ на свой вопрос я там не нашел. Память выделяется страницами. По 4Кб если не ошибаюсь. Поэтому под твое виртуальное адресное пространство (012C783C и т.д) будет выделен кусок реальной памяти 4Кб и его ты будешь видеть по адресам 012C7000 ... 012C7FFF Эти 4Кб будут недоступны другой программе, но если ты ими не будешь пользоваться (не будет обращений по этим адресам) и будет нехватка реальной памяти, то они просто освободятся (в общем случае уйдут в своп) и будут переданы другому процессу. Почитай эту книгу там подробно и доступно расписано как виндовс память использует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:44 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauluislom, то есть при таком присвоении литералов все таки расходуется память,...я понимаю что в данном случае это очень мало, но все таки Конечно. Она расходуется на диске в секции данных бинарника, и потом в RAM в сегменте данных процесса. Размеры strlen(literal)+1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 15:49 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
Dima T, спс, почитаю.. просто, на каждом шагу написано, "не забывайте удалять выделенную оператором new память ", а то что каждый строковой литерал занимает новый блок памяти не пишут..явно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:01 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauпросто, на каждом шагу написано, "не забывайте удалять выделенную оператором new память ", а то что каждый строковой литерал занимает новый блок памяти не пишут..явно Так это совсем про другое, тут ты память не выделяешь и освобождать ее тебе не надо. Для констант подкачка в память идет из EXE. Пишут потому что иногда и гигабайт надо выделить, а если забыть его освободить, то второй гигабайт может не выделиться, да и своп не резиновый (туда первый гигабайт ляжет и будет лежать пока твоя прога не завершится). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:09 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauDima T, спс, почитаю.. просто, на каждом шагу написано, "не забывайте удалять выделенную оператором new память ", а то что каждый строковой литерал занимает новый блок памяти не пишут..явно Литералами навыделяешь памяти ровно столько, сколько их сумеешь прописать в исходнике. New зверь другой природы: представь, что в цикле с миллионом итераций будешь делать new на каждом без delete. Память кончиться сразу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:12 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
ну что ж, точки над "i" расставлены, - всем спасибо... можно закрывать наверно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 16:17 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
On 22.04.2014 15:41, stud_nau wrote: > Так вот, блоки памяти (012C783C,012C783C+1,012C783C+2,012C783C+3) и > (012C7838,012C7838+1,012C7838+2,012C7838+3) доступны для других программ > во время выполнения текущей программы? Этот вопрос выходит за рамки языка С или С++. Логической памяти -- нет, не доступны. Физической памяти -- да, могут быть доступны. Это всё для современных популярных ОС и естественно в других ОС это может быть по-другому. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:30 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
On 22.04.2014 16:18, luislom wrote: > Для другого процесса, нет. Это достаточно наивное заявление. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:30 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
On 22.04.2014 17:01, stud_nau wrote: > просто, на каждом шагу написано, "не забывайте удалять выделенную > оператором new память ", а то что каждый строковой литерал занимает > новый блок памяти не пишут..явно ОК, ты её выделял ? Оператором new выделял ? Так о чём тогда разговор ? Ты какие-то другие языки программирования знаешь ? (чтобы тебе пример привести) Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:32 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
stud_nauDima T, спс, почитаю.. просто, на каждом шагу написано, "не забывайте удалять выделенную оператором new память ", а то что каждый строковой литерал занимает новый блок памяти не пишут..явно Гм... Пишут, ещё как пишут. Стандарт почитай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 17:35 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
MasterZivЭто достаточно наивное заявление. А не расскажет ли мастер в этом отдельно взятом государстве, как я смогу получить данные из сегмента данных другого процесса? Не зная его идентификаторов, и того, запущен он вообще или нет. P.S работа происходит не в режиме ядра, а в режиме процесса пользовательского уровня. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:26 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
MasterZiv, к чему все это глумление? Все твои опусы выше можно коротко: "не умеешь писать - нех.. начинать". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:31 |
|
||
|
указатели и строки в С++
|
|||
|---|---|---|---|
|
#18+
smaldMasterZivЭто достаточно наивное заявление. А не расскажет ли мастер в этом отдельно взятом государстве, как я смогу получить данные из сегмента данных другого процесса? Не зная его идентификаторов, и того, запущен он вообще или нет. P.S работа происходит не в режиме ядра, а в режиме процесса пользовательского уровня. Вопрос был не по получить, а про "доступны ли для других программ во время выполнения текущей программы". Просто запусти несколько экземпляров такой программы — и сегмент констант почти наверняка у них будет один и он будет всем им доступен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 18:55 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38621812&tid=2019514]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 308ms |
| total: | 485ms |

| 0 / 0 |
