Форум программистов, компьютерный форум CyberForum.ru

Как узнать, сколько памяти занимает тот или иной элемент программы? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.71
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 02:36     Как узнать, сколько памяти занимает тот или иной элемент программы? #1
Товарищи, подскажите, пожалуйста, ответы на следующие вопросы:
1) Есть какие-либо средства определения, сколько памяти жрёт программа в целом и ее составные части (сколько требуется под код, под данные)?
2) Сколько памяти расходуется под стандартные контейнеры? Например под вектор?
3) Если используются несколько однотипных векторов (например vector<int>), то они полностью дублируются, или код у них один на всех, а добавляются только их элементы? Тот же вопрос, но про разнотипные вектора (например <int> и <double>).

Добавлено через 9 минут
Ну и еще вопрос:
Синтаксис С++ я более-менее освоил по "Полному справочнику" Шилдта, теперь хочу научиться писать грамотно, чтобы программы работали быстро и жрали мало памяти. Подскажите, что стоит почитать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2011, 02:36     Как узнать, сколько памяти занимает тот или иной элемент программы?
Посмотрите здесь:

C++ Как узнать, в процесе отладки, сколько памяти занимает программа?
Обработка файлов. Определить, как часто появляется той или иной байт C++
Реализовать меню, которое позволит запускать тот или иной код C++
C++ Как определить, сколько байт занимает массив?
Сколько памяти занимает указатель? Ссылка? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shaffle
1 / 1 / 0
Регистрация: 21.11.2010
Сообщений: 85
13.11.2011, 02:37     Как узнать, сколько памяти занимает тот или иной элемент программы? #2
на счет размера используй sizeof();
определит размер каждой переменной, типа, массива, или структуры..
Bers
Заблокирован
13.11.2011, 02:42     Как узнать, сколько памяти занимает тот или иной элемент программы? #3
Цитата Сообщение от Svinina Посмотреть сообщение
Синтаксис С++ я более-менее освоил по "Полному справочнику" Шилдта, теперь хочу научиться писать грамотно, чтобы программы работали быстро и жрали мало памяти. Подскажите, что стоит почитать.
Начни кодить реальный проектик. Сразу появится масса конкретных вопросов.
Будит конкретика - будит понятно, в какую сторону нужно копать.


Цитата Сообщение от shaffle Посмотреть сообщение
на счет размера используй sizeof();
определит размер каждой переменной, типа, массива, или структуры..
как вы с помощью sizeof() определите сколько байт сожрал вектор? (не его элементы, а сам вектор)
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 02:44  [ТС]     Как узнать, сколько памяти занимает тот или иной элемент программы? #4
Цитата Сообщение от shaffle Посмотреть сообщение
на счет размера используй sizeof();
определит размер каждой переменной, типа, массива, или структуры..
Ну это понятно) Другое, что не могу понять: применительно к экземпляру класса он что выводит? Сумму памяти, затраченной на поля? На код? На то и другое вместевзятое?
Bers
Заблокирован
13.11.2011, 02:47     Как узнать, сколько памяти занимает тот или иной элемент программы? #5
Цитата Сообщение от Svinina Посмотреть сообщение
Ну это понятно) Другое, что не могу понять: применительно к экземпляру класса он что выводит? Сумму памяти, затраченной на поля? На код? На то и другое вместевзятое?
sizeof(vec) выведет, сколько байт весит один экземпляр вектора. Сколько сожрал сам вектор, и сколько ещё при этом сожрали его элементы, sizeof() не знает.


Я заметил, вы не в полне осознаёте что такое класс, а что такое экземпляр. В чем между ними принципиальное отличие
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 02:54  [ТС]     Как узнать, сколько памяти занимает тот или иной элемент программы? #6
Bers, так я как раз этим и занимаюсь. Сейчас конкретный проект, дипломный. Пишу хитрый поисковик для СППР. Вкратце: поиск осуществляется в онтологической базе знаний. Документы и запросы представляются в виде графов, построенных на основе графа семантической сети онтологии. Конкретно сейчас моя проблема - граф семантической сети онтологии переборно большой и надо его как-то разместить в памяти. И я пытаюсь найти оптимальное решение этой проблемы, поэтому затратами памяти и интересуюсь=)

Добавлено через 4 минуты
Цитата Сообщение от Bers Посмотреть сообщение
sizeof(vec) выведет, сколько байт весит один экземпляр вектора. Сколько сожрал сам вектор, и сколько ещё при этом сожрали его элементы, sizeof() не знает.


Я заметил, вы не в полне осознаёте что такое класс, а что такое экземпляр. В чем между ними принципиальное отличие
Класс описывает некоторую структуру данных и операции над ними, экземпляр это конкретные структурированные данные в памяти, над которыми можно производить эти операции, нет?
Bers
Заблокирован
13.11.2011, 02:55     Как узнать, сколько памяти занимает тот или иной элемент программы? #7
Svinina, а я б не стал по поводу расхода памяти заморачиваться.
Вот если б её реально не хватало - тогда бы и думал.

Лучше подумать, как можно собрать архитектуру проекта так, что бы в случае чего можно было относительно легко и безболезненно заменять одни куски кода на другие.

А потом, если так сильно будит нужно - можно всегда будит эти отдельные куски оптимизировать.

Если не знаешь заранее с какими проблемами столкнешься, и как их можно будит решить, лучше раньше времени не пытаться ничего оптимизировать)
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 03:07  [ТС]     Как узнать, сколько памяти занимает тот или иной элемент программы? #8
Но вы правы, я действительно многого не понимаю. Например где и как хранится определение класса.

Добавлено через 9 минут
Цитата Сообщение от Bers Посмотреть сообщение
Svinina, а я б не стал по поводу расхода памяти заморачиваться.
Вот если б её реально не хватало - тогда бы и думал.

Лучше подумать, как можно собрать архитектуру проекта так, что бы в случае чего можно было относительно легко и безболезненно заменять одни куски кода на другие.

А потом, если так сильно будит нужно - можно всегда будит эти отдельные куски оптимизировать.

Если не знаешь заранее с какими проблемами столкнешься, и как их можно будит решить, лучше раньше времени не пытаться ничего оптимизировать)
Как можно думать над архитектурой проекта, не думая над организацией данных? Это же принципиальный вопрос: как вообще описать граф и как описать операции, производимые над ним. Либо узлы делать объектами с определенным функционалом, ребра же напрямую не описывая, а делая у каждого узла вектор указателей на его соседей (помнишь про архитектурные ошибки ты мне объяснял? Вот для этого мне и нужен был вектор указателей). Либо ребра задавать матрицей смежности (плохой подход, учитывая что на практике матрица будет оооочень разреженной) и т.д. Масса вариантов, и для каждого функционал свой будет.
Bers
Заблокирован
13.11.2011, 03:08     Как узнать, сколько памяти занимает тот или иной элемент программы? #9
Мне это трудновато объяснить будит...

Класс, такой, каким его видит программист существует только в виде исходного кода.

После компиляции, он превращается в исполняемый код, и по сути является просто кучкой функций (бывших методов), которые в качестве одного из аргументов принимают указатель this объекта.

Если на псевдокоде, то:
Запись вида Obj.Method() трансформируется в запись вида Method(SomeClass* Obj);

Сам же объект - суть структура, которая тождественна данным-членам класса.

sizeof(SomeClass) вернёт размер этой структуры (размер объекта), а не "класса".

Механически, класс - это кучка функций-обработчиков данных.
А объект - структура, аналогичная структуре данных членов, описанных в классе.
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 03:17  [ТС]     Как узнать, сколько памяти занимает тот или иной элемент программы? #10
Цитата Сообщение от Bers Посмотреть сообщение
Механически, класс - это кучка функций-обработчиков данных.
Так все-таки, можно как-нибудь узнать, сколько весят эти функции-обработчики?
Bers
Заблокирован
13.11.2011, 03:17     Как узнать, сколько памяти занимает тот или иной элемент программы? #11
Цитата Сообщение от Svinina Посмотреть сообщение
Как можно думать над архитектурой проекта, не думая над организацией данных?
В ООП данные - это объекты. Но штука в том, что объекты с точки зрения ООП, это больше чем просто данные.
Это своего рода инструменты. Этакие полностью самостоятельные сущности, у которых могут быть разнообразные умения.

Программирование в стиле ООП заключается в том, что бы понять, какие потребуются инструменты для решения задачи. Как эти инструменты будут друг с другом взаимодействовать.

Все вместе в сборе это называется "архитектура".

Поэтому, в некотором смысле, можно сказать, что "организация данных" в ООП - это "проектирование архитектуры".
Bers
Заблокирован
13.11.2011, 03:25     Как узнать, сколько памяти занимает тот или иной элемент программы? #12
Цитата Сообщение от Svinina Посмотреть сообщение
Как можно думать над архитектурой проекта, не думая над организацией данных?
В ООП данные - это объекты. Но штука в том, что объекты с точки зрения ООП, это больше чем просто данные.
Это своего рода инструменты. Этакие полностью самостоятельные сущности, у которых могут быть разнообразные умения.

Программирование в стиле ООП заключается в том, что бы понять, какие потребуются инструменты для решения задачи. Как эти инструменты будут друг с другом взаимодействовать.

Все вместе в сборе это называется "архитектура".

Поэтому, в некотором смысле, можно сказать, что "организация данных" в ООП - это "проектирование архитектуры".
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 03:34  [ТС]     Как узнать, сколько памяти занимает тот или иной элемент программы? #13
Ну так и я о том же. Думая над проектированием архитектуры я по любому думаю над организацией данных. И зная, что на реальной задаче у меня будут конкретные проблемы с нехваткой памяти, я пытаюсь их организовать таким образом, чтобы эти проблемы меня не доставали.
Bers
Заблокирован
13.11.2011, 03:43     Как узнать, сколько памяти занимает тот или иной элемент программы? #14
Цитата Сообщение от Svinina Посмотреть сообщение
Так все-таки, можно как-нибудь узнать, сколько весят эти функции-обработчики?
Ниразу даже не задавался таким вопросом.
Это нужно спрашивать у более низкоуровневых программистов.

Но подозреваю, что тебе ответят что-то типа: "зависит от компилятора и его настроек".
Что означает, что даже на одном компиляторе, но с разными настройками размер может получиться разным.
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 03:53  [ТС]     Как узнать, сколько памяти занимает тот или иной элемент программы? #15
Понятно. Тогда такой вопрос: допустим есть такой код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class test
{
public:
    double *b;
    test();
}
 
test::test()
{
    b = new double [4];
    for(int i = 0; i < 4; i++) b[i] = 0.1;
}
 
int main()
{
    test a;
    cout << sizeof(a);
    return 0;
}
Такой код мне выведет размер указателя b, т.е. 4. А можно ли как-нибудь вывести размер всей затраченной памяти на массив b?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.11.2011, 04:34     Как узнать, сколько памяти занимает тот или иной элемент программы? #16
C++
1
cout << sizeof(double) * size;
где size - размер массива.
Svinina
 Аватар для Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
13.11.2011, 04:57  [ТС]     Как узнать, сколько памяти занимает тот или иной элемент программы? #17
Цитата Сообщение от Chelioss Посмотреть сообщение
C++
1
cout << sizeof(double) * size;
где size - размер массива.
Ну уж совсем за дебила меня держите.
Мне интересно другое. В классе динамически выделяется кусок памяти под массив. Мне интересно, можно ли определить, сколько было выделено памяти, или нет.
Что-то мне подсказывает, что нет, но хочу убедиться.

Добавлено через 2 минуты
Цитата Сообщение от Chelioss Посмотреть сообщение
C++
1
cout << sizeof(double) * size;
где size - размер массива.
Ну уж совсем за дебила меня держите.
Мне интересно другое. В классе динамически выделяется кусок памяти под массив. Мне интересно, можно ли не зная размер этого массива определить, сколько было выделено памяти, или нет.
Что-то мне подсказывает, что нет, но хочу убедиться.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
13.11.2011, 05:08     Как узнать, сколько памяти занимает тот или иной элемент программы? #18
Нет, нельзя.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 05:19     Как узнать, сколько памяти занимает тот или иной элемент программы?
Еще ссылки по теме:

Где используется тот ли иной язык программирования? Какой из них выбрать для решения задачи? C++
Сколько памяти занимает комплексное число? C++
Сколько оперативной памяти занимает приложение? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Bers
Заблокирован
13.11.2011, 05:19     Как узнать, сколько памяти занимает тот или иной элемент программы? #19
Цитата Сообщение от Svinina Посмотреть сообщение
Что-то мне подсказывает, что нет, но хочу убедиться.
Можно, но:

1. Способ не портируемый (компиляторо-зависимый)
2. Не точный (размер может получиться немножко больше, чем на самом деле)

3. В твоём случае этот способ все равно не сработает. Потому что, если добавить в данные-члены другие объекты, которые в свою очередь могут содержать свои объекты, которые в свою очередь....

В общем, если по заданию требуется в любой момент времени точно знать сколько жрет объект, потребуется каждому объекту сделать метод GetMemory() который в своём методе будит смотреть на свои данные-члены, и если член - объект, будит делать метод GetMemory() уже этому объекту, а тот в свою очередь точно так же... и так по всей иерархии объектов до самых низов.

В итоге: поддержка такой системы, это настоящее шаманство с пляской и бубнами. А сама операция в целом или дорогостоящая по времени, или реализована по довольно таки сложному алгоритму, который тоже будит жрать память.

В любом случае, поддержка такой системы дело будит трудоёмкое. Считай каждый класс твоей архитектуры должен будит иметь метод GetMemory()

/зы можно просто опрашивать систему на предмет "оставшейся свободной памяти", ну или "сколько памяти скушал процесс", В общем, такие вопросы лучше решать во взаимодействии с системой, а не гнать жосскую отсебятину.
Yandex
Объявления
13.11.2011, 05:19     Как узнать, сколько памяти занимает тот или иной элемент программы?
Ответ Создать тему
Опции темы

Текущее время: 20:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru