Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > адреса и виды памяти


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

Код

#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                //  Динамическая память

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

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


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

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

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

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

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


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

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

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

Автор: tolgamrab 3.2.2010, 18:23
Переменные t, x, a, v, pi располагаются в стеке

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



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

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

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

Цитата

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

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

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

Адреса меня интересуют как вспомогательное средство, чтобы посмотреть, в какой памяти располагаются те или иные объекты данных (в С++ под Windows). Например, было неожиданным увидеть (см. пример выше), что vector-объекты размещаются в автоматической памяти (если судить по адресам).

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

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

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

Действительно в куче. 

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

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

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

Хорошая и наиболее полная классификация проведена у Саттера в решении сложных задач, глава 6
Константные данные - данные, определенные на этапе компиляции. Строковые константы и т.п.
Стек - автоматические переменные. Тут нужно иметь ввиду, что для потоков стек может располагаться и в другой области памяти.
Свободная динамическая память - память доступная для управления по new/delete
Куча - память - память доступная для управления по malloc/free. Тоже динамическая память, но выделяется в отдельную группу, так как память распределенная по new не должна освобождаться при помощи free.

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

Но физически они не отличаются (по крайней мере под MSVC).

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)