Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строки, константы, память 
:(
    Опции темы
tofreesky
Дата 21.6.2010, 03:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



Как сделать что бы у скомпилированной программы память расходовалась рациональнее?

Например:

struct abc{
 char a[300];
 int b;
};

const struct abc arr[] = {
{"abcde",0},
{"abcdef",4},
...
};

При увеличении кол-ва эллементов массива arr, размер откомпилированной программы возрастает в разы.
Как сделать что бы при компилировании, для каждого эллемента выделялось не 300 символов, а столько сколько нужно?
PM MAIL   Вверх
borisbn
Дата 21.6.2010, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Использовать std::string, а не char[300] для Си++ или char* для Си и выделять памсть динамически через malloc/free


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
586
Дата 21.6.2010, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(tofreesky @  21.6.2010,  04:48 Найти цитируемый пост)
Как сделать что бы при компилировании, для каждого эллемента выделялось не 300 символов, а столько сколько нужно? 

Код
struct abc{
 const char *a;
 int b;
};

const struct abc arr[] = {
{"abcde",0},
{"abcdef",4},
...
};


Это сообщение отредактировал(а) 586 - 21.6.2010, 08:10
PM   Вверх
Dem_max
Дата 21.6.2010, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



не делать статическую инициализацию данных на стадии компиляции как вот это 
Код

const struct abc arr[] = {
{"abcde",0},
{"abcdef",4},
...
};

или это
Код

char txt[65000] = ""; // Увеличивается размер EXE
char txt[65000] = {0}; // Увеличивается размер EXE
char txt[65000]; // НЕ увеличивается размер EXE



заполнять данные структуры нужно в ручную и во время исполнения кода программы

Код

char txt[300];

struct abc{
 char a[300];
 int b;
};

struct abc arr[400];

strcpy(arr[0].a, txt);
arr[0].b = 10;


Код

char txt[300];

struct abc{
 char a[300];
 int b;
};

struct abc arr[400];

strcpy(arr[0].a, txt);
arr[0].b = 10;


Код

char *txt;

struct abc{
 char *a;
 int b;
};

struct abc arr[400];

txt = new char[300];
strcpy(txt, "text");
arr[0].a = txt;
arr[0].b = 10;


Тогда твой EXE не будет разрастаться. 

Это сообщение отредактировал(а) Dem_max - 21.6.2010, 08:41


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
tofreesky
Дата 21.6.2010, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



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

Добавлено через 9 минут и 8 секунд
Это такая оптимизация новая?  smile 

GCC компилятор, при компиляции вроде если нашел в исходном коде, одинаковые строковые константы, и в разных местах должны быть указатели, то они пишет только один экземпляр строки и указывает адрес на нее везде. Это я беглым просмотром в HEX редакторе выяснил, ВРОДЕ. Так может быть?
Такая оптимизация где-то применяется?
PM MAIL   Вверх
Dem_max
Дата 21.6.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

Проблема лишь в том что бы скомпилированные константные структуры расходвали память рационально.

Так они у тебя и расходуются рационально, практически. Нужно только структуру выровнять  по границе 1 байта


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
tofreesky
Дата 21.6.2010, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 152
Регистрация: 9.6.2010

Репутация: нет
Всего: нет



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


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

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