Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> адреса и виды памяти 
:(
    Опции темы
FCM
Дата 3.2.2010, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Можно ли по адресам судить о виде памяти, в которой размещается объект данных?
Например, 

Код

#include<iostream>
#include<vector>
using namespace std;

void view_addr_of_local(int x)
{ int t=x; cout << "&local: " << &t << endl;}

int gi = 1;

int main()
{
    cout << "&gi: " << &gi << endl; 
    view_addr_of_local(gi);
    int a[2] = {1,2};        cout << "a:   " << a << endl;
    vector<int> v(2);       cout << "&v:  " << &v << endl;
    int *pi = new int(1);  cout << "pi:  " << pi << endl;
    delete pi;
    return 0;
}


Результат
Код

&gi: 0041B004               //  Статическая память 
&local: 0012FE24           //  Автоматическая память
a:   0012FF50                //  Автоматическая память ???  
&v:  0012FF34               //  Автоматическая память ???   
pi:  003463E0                //  Динамическая память

PM MAIL   Вверх
xvr
Дата 3.2.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Переносимо - нет. Для каждой конкретной платформы (и/или компилятора) иногда можно что то такое написать.

PM MAIL   Вверх
FCM
Дата 3.2.2010, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(xvr @  3.2.2010,  11:48 Найти цитируемый пост)
Переносимо - нет. Для каждой конкретной платформы (и/или компилятора) иногда можно что то такое написать.


Ну возможно у ячеек, выделяемых под тот или иной вид памяти, будут отличаться адреса (например gcc/win вместо 0012... выдаст 0022...), но классификация памяти для указанных объектов данных останется?

Это сообщение отредактировал(а) FCM - 3.2.2010, 12:35
PM MAIL   Вверх
xvr
Дата 3.2.2010, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(FCM @ 3.2.2010,  12:35)
Ну возможно у ячеек, выделяемых под тот или иной вид памяти, будут отличаться адреса (например gcc/win вместо 0012... выдаст 0022...), но классификация памяти для указанных объектов данных останется?

Классификация - да, а вот адреса могут быть самые разные. Останется их относительное (друг друга) расположения, но конкретные величины будут плавать.
Кроме того, по одним абсолютным адресам ничего сказать нельзя, нужна какая то привязка к самой программе (например, неплохо было бы знать, где у нее расположен сегмент данных, для определения статических переменных), и привязка к run-time: например нужно знать значение указателя стека (регистр esp), что бы отличить автоматические переменные (стековые) от объектов в куче.
Если в программе есть thread'ы, то дело усложняется, т.к. автоматические переменные в чужом thread'е вообще будет сложно опознать

Если же дело коснется различия Win/Linux, то у них вообще все по разному  smile 

PM MAIL   Вверх
FCM
Дата 3.2.2010, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(xvr @  3.2.2010,  13:14 Найти цитируемый пост)
Классификация - да


Ну собственно, меня интересует, в памяти какого вида  располагаются встроенные (нединамические) массивы и контейнеры.

Это сообщение отредактировал(а) FCM - 3.2.2010, 16:47
PM MAIL   Вверх
xvr
Дата 3.2.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(FCM @ 3.2.2010,  16:36)
Ну собственно, меня интересует, в памяти какого вида  располагаются встроенные (нединамические) массивы и контейнеры.

'Встроенные' массивы - там где описанны. Что такое 'встроенные контейнеры' я не очень понимаю, в С++ таковых нету (если считать, что они должны отличаться от 'встроенных массивов')  smile 

PM MAIL   Вверх
tolgamrab
Дата 3.2.2010, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 1.2.2010
Где: г. Смоленск

Репутация: нет
Всего: нет



Переменные t, x, a, v, pi располагаются в стеке
PM MAIL ICQ   Вверх
FCM
Дата 3.2.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(xvr @  3.2.2010,  17:52 Найти цитируемый пост)
'Встроенные' массивы - там где описанны. Что такое 'встроенные контейнеры' я не очень понимаю, в С++ таковых нету (если считать, что они должны отличаться от 'встроенных массивов') 



Описаны они в области видимости, а речь идет о размещении в памяти.
Слово "встроенные" к контейнерам я и не относил.

Это сообщение отредактировал(а) FCM - 3.2.2010, 19:24
PM MAIL   Вверх
xvr
Дата 3.2.2010, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(FCM @ 3.2.2010,  19:23)
Описаны они в области видимости, а речь идет о размещении в памяти.

Описанны они в программе, область видимости относится именно к видимости их, а не к их размещению и времени жизни.
Собственно переменные бывают автоматические (размещаются на стеке) и статические (размещаются в сегменте данных).
Переменных на куче в С++ нет, есть только области памяти [на куче] до которой можно добраться с помощью указателя

Цитата

Слово "встроенные" к контейнерам я и не относил.
В таком случае контейнеры - это просто классы, и размещение их содержимого (НЕ САМИХ КЛАССОВ) полностью определяется реализацией (обычно на куче)

PM MAIL   Вверх
jonie
Дата 4.2.2010, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



можно переобпределить new \ malloc и т.д., и делать "свою память" - выделяемые адреса вы знать будете.... но зачем ...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
FCM
Дата 4.2.2010, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(jonie @  4.2.2010,  02:17 Найти цитируемый пост)
выделяемые адреса вы знать будете.... но зачем ...

Адреса меня интересуют как вспомогательное средство, чтобы посмотреть, в какой памяти располагаются те или иные объекты данных (в С++ под Windows). Например, было неожиданным увидеть (см. пример выше), что vector-объекты размещаются в автоматической памяти (если судить по адресам).
PM MAIL   Вверх
xvr
Дата 4.2.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(FCM @ 4.2.2010,  07:32)
Например, было неожиданным увидеть (см. пример выше), что vector-объекты размещаются в автоматической памяти (если судить по адресам).

Сама переменная типа vector располагается в стеке, а вот его содержимое - в куче. Распечатайте &v[0]

PM MAIL   Вверх
FCM
Дата 4.2.2010, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(xvr @  4.2.2010,  08:31 Найти цитируемый пост)
Распечатайте &v[0]

Действительно в куче. 
PM MAIL   Вверх
jonie
Дата 4.2.2010, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



вы еще на хитрые std::string посмотрите в реализации майкрософта.. там они если строка небольшая, то в стеке ее хранят, иначе перебрасывают в heap....


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
tolgamrab
Дата 4.2.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 1.2.2010
Где: г. Смоленск

Репутация: нет
Всего: нет



Цитата(jonie @  4.2.2010,  12:38 Найти цитируемый пост)
там они если строка небольшая, то в стеке ее хранят, иначе перебрасывают в heap

Не сам объект, а только внутренние ресурсы для размещения контента. Размещение самого объекта зависит только от того, как объект был объявлен. 

Хорошая и наиболее полная классификация проведена у Саттера в решении сложных задач, глава 6
Константные данные - данные, определенные на этапе компиляции. Строковые константы и т.п.
Стек - автоматические переменные. Тут нужно иметь ввиду, что для потоков стек может располагаться и в другой области памяти.
Свободная динамическая память - память доступная для управления по new/delete
Куча - память - память доступная для управления по malloc/free. Тоже динамическая память, но выделяется в отдельную группу, так как память распределенная по new не должна освобождаться при помощи free.
PM MAIL ICQ   Вверх
FCM
Дата 4.2.2010, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Цитата(tolgamrab @  4.2.2010,  13:42 Найти цитируемый пост)
Свободная динамическая память - память доступная для управления по new/delete
Куча - память - память доступная для управления по malloc/free. Тоже динамическая память, но выделяется в отдельную группу, так как память распределенная по new не должна освобождаться при помощи free.

Но физически они не отличаются (по крайней мере под MSVC).
PM MAIL   Вверх
mes
Дата 4.2.2010, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(FCM @  4.2.2010,  19:42 Найти цитируемый пост)
Но физически они не отличаются (по крайней мере под MSVC). 

смотря, что подразумевать под словом "физически". 
Способ управления памятью разный - этого достаточно.


--------------------
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0610 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.