Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 41, средняя оценка - 4.71
Svinina
5 / 5 / 0
Регистрация: 28.11.2010
Сообщений: 81
#1

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

13.11.2011, 02:36. Просмотров 6457. Ответов 18
Метки нет (Все метки)

Товарищи, подскажите, пожалуйста, ответы на следующие вопросы:
1) Есть какие-либо средства определения, сколько памяти жрёт программа в целом и ее составные части (сколько требуется под код, под данные)?
2) Сколько памяти расходуется под стандартные контейнеры? Например под вектор?
3) Если используются несколько однотипных векторов (например vector<int>), то они полностью дублируются, или код у них один на всех, а добавляются только их элементы? Тот же вопрос, но про разнотипные вектора (например <int> и <double>).

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

Как узнать, в процесе отладки, сколько памяти занимает программа? - C++
Вот чтобы проследить за тем сколько и когда программа занимает и какое количество килобайт под капие переменные.... Чтобы увидеть что...

При вводе того или иного пароля открывать тот или иной txt-файл - C++
Добрый вечер. Нужно написать программу, которая будет при вводе того или иного пароля открывать тот или иной .txt файл. Например: ...

Реализовать меню, которое позволит запускать тот или иной код - C++
Нужно слепить две простейших программы в одну и сделать простую менюшку выбора, той программы, которую хочу использовать. Есть у кого...

Написать функцию, которая возвращает тот или иной тип переменной по условию - C++
Привет, я тут делаю кое-что. У меня вопрос. А могу ли я сделать функцию, которая возвращает тот или иной тип переменной, в зависимости от...

Сколько памяти занимает метод? - C++
Сколько памяти в классе выделяется под метод?

Сколько памяти занимает указатель? Ссылка? - C++
Вот никак не могу найти ответы на эти вопросы. Указатели и ссылки эффективны в плане времени, но что касается выделяемой памяти, хотелось...

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


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


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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Но подозреваю, что тебе ответят что-то типа: "зависит от компилятора и его настроек".
Что означает, что даже на одном компиляторе, но с разными настройками размер может получиться разным.
1
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?
0
13.11.2011, 03:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2011, 03:53
Привет! Вот еще темы с ответами:

Сколько оперативной памяти занимает приложение? - C++
Как определить в c++ сколько оперативной памяти занимает приложение?

Сколько памяти занимает комплексное число? - C++
Здравствуйте! Подскажите пожалуйста байтовый (или битовый) размер комплексных типов данных. Например 32fc будет занимать 32 бита, или...

Сколько памяти занимает квадратная матрица вида char c[3][3]? - C++
Всем привет, недавно задали вопрос: &quot;Сколько памяти занимает матрица вида&quot; char c; Я сразу ответил 9 байт. На что последовал...

Почему выводится один и тот же адрес памяти при одновременных запусках одной программы - C++
Здравствуйте, уважаемые программисты У меня к вам такой вопрос: при запуске программы, которая содержит указатель на некую переменную...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru