Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.3105 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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