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


Автор: tofreesky 21.6.2010, 03:48
Как сделать что бы у скомпилированной программы память расходовалась рациональнее?

Например:

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

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

При увеличении кол-ва эллементов массива arr, размер откомпилированной программы возрастает в разы.
Как сделать что бы при компилировании, для каждого эллемента выделялось не 300 символов, а столько сколько нужно?

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

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

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

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

Автор: Dem_max 21.6.2010, 08: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 не будет разрастаться. 

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

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

GCC компилятор, при компиляции вроде если нашел в исходном коде, одинаковые строковые константы, и в разных местах должны быть указатели, то они пишет только один экземпляр строки и указывает адрес на нее везде. Это я беглым просмотром в HEX редакторе выяснил, ВРОДЕ. Так может быть?
Такая оптимизация где-то применяется?

Автор: Dem_max 21.6.2010, 13:28
Цитата

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

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

Автор: tofreesky 21.6.2010, 13:36
Я сделал, как сказали в третьем сообщении, сам что-то не догадался до этого.

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