![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| FCM |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Можно ли по адресам судить о виде памяти, в которой размещается объект данных?
Например,
Результат
|
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Переносимо - нет. Для каждой конкретной платформы (и/или компилятора) иногда можно что то такое написать.
|
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Ну возможно у ячеек, выделяемых под тот или иной вид памяти, будут отличаться адреса (например gcc/win вместо 0012... выдаст 0022...), но классификация памяти для указанных объектов данных останется? Это сообщение отредактировал(а) FCM - 3.2.2010, 12:35 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Классификация - да, а вот адреса могут быть самые разные. Останется их относительное (друг друга) расположения, но конкретные величины будут плавать. Кроме того, по одним абсолютным адресам ничего сказать нельзя, нужна какая то привязка к самой программе (например, неплохо было бы знать, где у нее расположен сегмент данных, для определения статических переменных), и привязка к run-time: например нужно знать значение указателя стека (регистр esp), что бы отличить автоматические переменные (стековые) от объектов в куче. Если в программе есть thread'ы, то дело усложняется, т.к. автоматические переменные в чужом thread'е вообще будет сложно опознать Если же дело коснется различия Win/Linux, то у них вообще все по разному |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
'Встроенные' массивы - там где описанны. Что такое 'встроенные контейнеры' я не очень понимаю, в С++ таковых нету (если считать, что они должны отличаться от 'встроенных массивов') |
|||
|
||||
| tolgamrab |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 1.2.2010 Где: г. Смоленск Репутация: нет Всего: нет |
Переменные t, x, a, v, pi располагаются в стеке
|
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Описаны они в области видимости, а речь идет о размещении в памяти. Слово "встроенные" к контейнерам я и не относил. Это сообщение отредактировал(а) FCM - 3.2.2010, 19:24 |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Описанны они в программе, область видимости относится именно к видимости их, а не к их размещению и времени жизни. Собственно переменные бывают автоматические (размещаются на стеке) и статические (размещаются в сегменте данных). Переменных на куче в С++ нет, есть только области памяти [на куче] до которой можно добраться с помощью указателя
|
||||
|
|||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
можно переобпределить new \ malloc и т.д., и делать "свою память" - выделяемые адреса вы знать будете.... но зачем ...
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
Адреса меня интересуют как вспомогательное средство, чтобы посмотреть, в какой памяти располагаются те или иные объекты данных (в С++ под Windows). Например, было неожиданным увидеть (см. пример выше), что vector-объекты размещаются в автоматической памяти (если судить по адресам). |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Сама переменная типа vector располагается в стеке, а вот его содержимое - в куче. Распечатайте &v[0] |
|||
|
||||
| FCM |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 461 Регистрация: 30.3.2009 Репутация: нет Всего: 9 |
||||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 15 Всего: 118 |
вы еще на хитрые std::string посмотрите в реализации майкрософта.. там они если строка небольшая, то в стеке ее хранят, иначе перебрасывают в heap....
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| tolgamrab |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 1.2.2010 Где: г. Смоленск Репутация: нет Всего: нет |
Не сам объект, а только внутренние ресурсы для размещения контента. Размещение самого объекта зависит только от того, как объект был объявлен. Хорошая и наиболее полная классификация проведена у Саттера в решении сложных задач, глава 6 Константные данные - данные, определенные на этапе компиляции. Строковые константы и т.п. Стек - автоматические переменные. Тут нужно иметь ввиду, что для потоков стек может располагаться и в другой области памяти. Свободная динамическая память - память доступная для управления по new/delete Куча - память - память доступная для управления по malloc/free. Тоже динамическая память, но выделяется в отдельную группу, так как память распределенная по new не должна освобождаться при помощи free. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |