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


Автор: Dexter 14.11.2002, 01:40
У меня тут такой вопрос возник. А много я буду экономить памяти, если заменять integer на word или ваще на byte ну например:


var
   I: integer   // Меняем на byte
begin
   for i:=1 to 10 do
        Form1.caption:=inttostr(i);
   end;


Автор: Vex 14.11.2002, 01:48
Смотря сколько будет переменных, если пару штук, то это мало что даст, а если, к примеру, масив 1000*1000 то экономия будет.

Автор: Chingachguk 14.11.2002, 01:53
Так лучше не делать. И вот почему(VC6++):

Цитата

1:    #include "stdio.h"
2:    #include "io.h"
3:    #include "sys/types.h"
4:    #include "sys/stat.h"
5:    #include "fcntl.h"
6:    #include "string.h"
7:    #include <stdlib.h>
8:
9:    typedef unsigned char       BYTE;
10:
11:   void main(void)
12:   {
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,48h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-48h]
0040101C   mov         ecx,12h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
13:       int Ineger_As_Index;
14:       BYTE byte_As_Index;
15:
16:
17:       for (Ineger_As_Index=0;Ineger_As_Index<10;Ineger_As_Index++);
00401028   mov         dword ptr [ebp-4],0
0040102F   jmp         main+2Ah (0040103a)
00401031   mov         eax,dword ptr [ebp-4]
00401034   add         eax,1
00401037   mov         dword ptr [ebp-4],eax
0040103A   cmp         dword ptr [ebp-4],0Ah
0040103E   jge         main+32h (00401042)
00401040   jmp         main+21h (00401031)
18:       for (byte_As_Index=0;byte_As_Index<10;byte_As_Index++);
00401042   mov         byte ptr [ebp-8],0
00401046   jmp         main+41h (00401051)
00401048   mov         cl,byte ptr [ebp-8]
0040104B   add         cl,1
0040104E   mov         byte ptr [ebp-8],cl
00401051   mov         edx,dword ptr [ebp-8]
00401054   and         edx,0FFh
0040105A   cmp         edx,0Ah
0040105D   jge         main+51h (00401061)
0040105F   jmp         main+38h (00401048)
19:
20:       printf("start ! \n");


Обрати внимание на "ужирнение" кода в случае использования BYTE вместо integer.

Автор: Chingachguk 14.11.2002, 01:54
Разумеется, если речь идет о ИНДЕКСЕ.

Автор: Vit 14.11.2002, 01:55
Экономия всегда будет, но если не идёт речь о массивах то экономия будет крайне незначительна, кроме того, по-моему (я не уверен - пусть меня поправят если я не прав) в зависимости от опций компилляции компилятор может выравнивать размеры структур, т.е. byte будет выравниваться до 4х байт в памяти для ускорения работы

Автор: Vit 14.11.2002, 01:56
Цитата(Chingachguk @ 13.11.2002, 08:53)
Обрати внимание на "ужирнение" кода в случае использования BYTE вместо integer.

Ха! Вот это новость! Слушай, а в каких ещё случаях это не целесообразно?

Автор: AntonSaburov 14.11.2002, 02:11
Так иея в том, что все переменные компилятор старается выравнивать по 4 байтам. Можно ему в принципе это дело запретить, но тогда работать будет медленнее. Тут уж надо выбирать - или экономить на памяти, или на скорости.

Автор: AntonSaburov 14.11.2002, 02:13
Кстати, сам MS компиляет свои программы для оптимизации памяти - тогда меньше операция подкачки и выигрышь по скорости. Но это тогда, когда памяти надо мно-о-о-о-о-го.

Автор: Song 14.11.2002, 03:54
Цитата(AntonSaburov @ 13.11.2002, 18:13)
Кстати, сам MS компиляет свои программы для оптимизации памяти - тогда меньше операция подкачки и выигрышь по скорости. Но это тогда, когда памяти надо мно-о-о-о-о-го.

Когда памяти мно-о-о-о-о-го, файл подкачки не нужен..

Автор: Chingachguk 14.11.2002, 17:16
Цитата

Vit Дата сообщения: 13.11.2002,17:56
Цитата (Chingachguk @ 13.11.2002,08:53)
Обрати внимание на "ужирнение" кода в случае использования BYTE вместо integer.

Ха! Вот это новость! Слушай, а в каких ещё случаях это не целесообразно?


Например, при передаче параметров в функцию:

procedure MyFunction(b1,b2,b3...: Byte или Word);

Если для этого нет особой нужды. Никакой экономии кода тут не происходит - скорее, наоборот.

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