LINUX.ORG.RU

Программа занимает много памяти [Новичок]

 , , ,


0

1

Решил я, значит, изучить плюсы, но столкнулся с маленькой проблемой, которую никто и не замечает на моем этапе: программы занимают много памяти. Вот пример:

#include <iostream>
#include <vector>
#include <conio.h>
#include <string>

int main()
{
    using namespace std;
    string first_name; // Две строки, обозначающие имена
    string last_name;
    char grade;
    short age;
    cout << "What is your first name?\n";
    getline(cin, first_name);
    cout << "What is your last name?\n";
    getline(cin, last_name); // Для того, чтобы можно было ввести два и более слова с пробелом
    cout << "What letter grade do you deserve?\n";
    cin >> grade;
    cout << "How old are you?\n";
    cin >> age;
    cout << "Name: " << last_name << ", " << first_name << endl; // Вывод данных
    cout << "Grade: " << grade << endl;
    cout << "Age: " << age << endl;
    _getch();
    return 0;
}

Занимает такая дрянь 904 КБ в режиме простоя и 944 в режиме пользования. А ведь хватало и 640 КБ навсегда!

Или вот еще пример, только я не до конца понял, как удалить указатель на name.

#include <iostream>

struct candy // Структура
{
       char *name; // Указатель, чтобы перенести в основной код
       float weight;
       int calories;
       };
int main()
{
    using namespace std;
    candy array[3]; // Массив структур
    array[0].name = "Verizon"; // Всякие левые данные
    array[0].weight = 2.56;
    array[0].calories = 200;
    array[1].name = "Spigel";
    array[1].weight = 2.43;
    array[1].calories = 350;
    array[2].name = "Rebel";
    array[2].weight = 1.58;
    array[2].calories = 400;
    cout << "If you will eat " << array[0].name << " chocolate, you will have " << array[0].calories
    << " calories and its weight is " << array[0].weight << endl; // Длиннокод, выводит данные
    cout << "If you will eat " << array[1].name << " chocolate, you will have " << array[1].calories
    << " calories and its weight is " << array[1].weight << endl;
    cout << "If you will eat " << array[2].name << " chocolate, you will have " << array[2].calories
    << " calories and its weight is " << array[2].weight << endl;
    cin.get();
    return 0;
}

Как можно сократить потребление памяти и возможно ли это на моем моменте развития?


Я не программирую на Сях, но мне кажется, что тут дело в подключаемых стандартных библиотеках. Если тебе нужно прям в спартанских условиях быть, то отрубай от проекта всякие стандартные библиотеки, оставляй только ввод-вывод например и подключай остальное по мере необходимости.

n0044h
()
Ответ на: комментарий от fluorite

Это Dev C++. На эти библиотеки можно внимания не обращать, я 15 минут доходил до cin.getline и думал, что проблема в cin.get, поэтому поставил _getch, потом решил зарубить строки, даже использовал vector для чего-то, но из всех библиотек остался только iostream и string.

Hubble
() автор топика
Ответ на: комментарий от n0044h

Если iostream отрубить, то, наверно, даже не будет cin cout работать, поэтому отметаем. Я уже пробовал все отрубать, как видишь во втором примере, но на производительность это не влияет.

Hubble
() автор топика

У тебя тут какая-то мешанина из сей и плюсов.

Как собираешь? И как смотришь?

XMs ★★★★★
()

gcc -S либо аналог этого в Dev-C++ - - и смотришь

qulinxao ★★☆
()
$ cat test.asm
format elf64 executable 3

zzz:
jmp zzz

$ ~/fasm/fasm test.asm test
$ ps -C test -o rss
  RSS
    4
anonymous
()

компильни:

int main(){
}

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

делай выводы

qulinxao ★★☆
()

И как ты замеряешь потребление памяти?

conio.h

facepalm.c

unt1tled ★★★★
()

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

Iron_Bug ★★★★★
()
Ответ на: комментарий от Hubble

conio — это Си. char * — это Си. Да, в плюсах так тоже можно делать, но это всё равно Си.

И ты не ответил, как компилируешь и замеряешь память. Даже под виндами можно тюнить настройки компилятора (кстати, там же можно и gcc/clang использовать)

XMs ★★★★★
()
Ответ на: комментарий от Hubble

Вопрос о том, где смотришь, отпадает. Смотри в профайлере, ну или хотя бы не в дефолтном таск-менеджере. А лучше загрузи нормальную систему, такой код скомпилится без проблем, если уберёшь всё связанное с conio

XMs ★★★★★
()

conio.h
_getch();

Я за бан.

anonymous
()
Ответ на: комментарий от XMs

Компилирую в режиме Релиза, замеряю через Таск Менеджер. А почему char* запрещен? Как тогда мне переносить строки из структуры вне функции?

Hubble
() автор топика
Ответ на: комментарий от Hubble

Компилирую в режиме Релиза

А отладочную информацию, случаем, не добавляешь?

замеряю через Таск Менеджер

По этому поводу тебе уже написали — смотри через профайлер, или хотя бы не через дефолтный таск-менеджер. Причина: он криво рассчитывает используемую память. Профайлеров в сети куча.

А почему char* запрещен?

Он не запрещён, просто в C++ для работы со строками, как и для управления памятью, например, существуют свои инструменты. На вопрос, как переносить строки, ответил анон — std::string (если STL, я предпочитаю QString, но это Qt)

XMs ★★★★★
()
Ответ на: комментарий от n0044h

Если тебе нужно прям в спартанских условиях быть, то отрубай от проекта всякие стандартные библиотеки, оставляй только ввод-вывод например и подключай остальное по мере необходимости.

Во-первых, это не С, а С++. Во-вторых, как ты собрался стандартную библиотеку отрубить?

UVV ★★★★★
()
Ответ на: комментарий от XMs

Нет. Хорошо. Да, теперь ясно. Спасибо большое!

Hubble
() автор топика
Ответ на: комментарий от anonymous

Вероятно даже сработает, не проверял. Только какой смысл писать на плюсах без стандартной библиотеки? Проще тогда сишку взять. Даже та же Qt по-умолчанию требует stdlib.

UVV ★★★★★
()
Ответ на: комментарий от Hubble

Это не компилятор, это IDE. И тебе правильно говорят выкинуть это дерьмо.

anonymous
()

Ты пишешь под встраиваемые системы? Нет? Тогда забей на эту экономию. Оптимизировать нужно без фанатизма, только когда твоя программа жрёт неоправдано много памяти.

anonymous
()
Ответ на: комментарий от UVV

да вроде даже с стандартной либой и на оффтопике не должна просецкая программка жрать столько памяти. это какое-то кривожопие либо в самом компиляторе, либо в его настройках.
а, да, есть ещё статическая линковка стандартных либов. наверняка, в Dev C++ такие же настройки есть. копать в сторону использования динамической линковки стандартных библиотек.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Hubble

--Кто «должен» упомянул?

--Ты!

чё за из под палки то?

хочешь--изучаешь. т.е изучаешь и осваиваешь чё хочешь - ща мир-экономика достаточно диверсифицированна, что бы найти применения кондицианированному школой-армией-универами индивиду.

qulinxao ★★☆
()
Ответ на: комментарий от Iron_Bug

Но ведь статическая линковка встраивает только используемые символы. А у него их там 3.5, плюс десяток по зависимостям. На почти мегабайт не тянет.

anonymous
()

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

В общем, попробуй сейчас прикинуть, какие задачи для тебя наиболее актуальные в данный момент и сосредоточь свое внимание именно на них. Умение писать быстрый надежный код, который занимает мало памяти приобретается итеративно, постепенно, это комплексная задача. Ты приобретаешь кучу навыков и знаний, которые и дают тебе возможность писать именно так, как тебе надо.

prefetch
()
Ответ на: комментарий от prefetch

Спасибо за совет. Просто не хочется писать такой софт, как нынче пишут: какой-нибудь скайп занимает аж 200 мегабайт в звонке, что вообще ужасно. Не говорю уж и про всякие профессиональные программы и игры, которые жрут по 8 гигабайт, да еще и требуют добавки.

Hubble
() автор топика

которую никто и не замечает на моем этапе:

ну-ну

next_time ★★★★★
()

по теме: посмотрите в настройках IDE, какие библиотеки она подключает по умолчанию, там могут быть лишние

next_time ★★★★★
()

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

anonymous
()

Из чего складывается размер занимаемой памяти: размер стека, размер самой исполняемой программы и данных, и куча. Естественно, ОС под всё это выделяет с запасом, например ту же кучу, под которую выделяется сразу несколько страниц памяти, дабы хип-менеджеру не приходилось часто дергать ядро по этим вопросам. 940Кб твоих это вполне нормально, что не так?

CatsCantFly
()
Ответ на: комментарий от anonymous

всякое бывает. я не знаю подробностей данного конкретного случая. но вот у нас был недавно казус: собираю мелкую утильку с uClibc и gcc-linaro, а она жрёт какое-то неприличное количество памяти. а у меня на железяке всего 32 метра, я утрамбовываю ядро ногами, а тут какая-то фигня мелкая жрёт аж 8 метров! как так-то? оказалось, были прилинкованы (только прилинкованы, и даже не статически) некоторые ненужные библиотеки с openssl и ещё какой-то мишурой для шифрования. причём они же были в зависимостях других библиотек, которые тоже линковались динамически. и почему-то эта линковка вызывала огромное потребление памяти в момент инициализации. видимо, статика там какая-то разворачивалась в памяти, или типа того и это отъедало ресурсы. после исключения ненужных линков программа стала жрать чуть больше метра.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Hubble

всякие профессиональные программы

Не волнуйся, с таким подходом тебе не грозит.

anonymous
()
Ответ на: комментарий от Hubble

А зачем человеку, занимающемуся C++ от силы дня 4-5, париться о потреблении памяти, которое на 300 КБ выше, чем ему хочется?

hlebushek ★★
()
Ответ на: комментарий от Iron_Bug

Он же в таск-менеджере смотрит, а там, вроде с седьмой, показывается какая-то дичь вместо нормальных значений. Да и я видел много негатива в сторону виндового менеджера памяти, который очень неоптимально эту память расходует, из-за чего (якобы) пришлось даже таск-менеджер переделывать, чтобы не фактическую показывал, а непонятно что.

Короче, путь ТСу на онтопик

XMs ★★★★★
()
Ответ на: комментарий от hlebushek

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

Iron_Bug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.