Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Новенький Гость
|
Добавлено: Ср Фев 11 2004 13:47 Заголовок сообщения: компиляция программ на c++ |
|
|
Добрый день!
начал изучать c++...
до этого немного писал на ассемблере...
асм копилировал и линковал при помощи TASM...
c++ сейчас компилирую и линкую при помощи Borland C++ Command Line Compiler или Borland C++ Builder...
так вот когда я писал на асме, то все проги получались маленькими по весу, даже меньше чем исходный код, счет шел буквально по байтам...
сейчас же создавая на c++, программы весят просто дико много...
например простая прога Hello World! на асме весит около 20 байт!
а на c++ если компилить через Borland C++ Builder получается 10 кило байт, а если через Borland C++ Command Line Compiler то вообще 120 кило байт...
как это понять, тупая прога вывода фразы на экран на c++ весит как гигантская прога написанная чисто на асме...
может я чего не так делаю? |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Ср Фев 11 2004 15:56 Заголовок сообщения: всё правильно |
|
|
Знаешь анекдот про программиста который ставит рядом с кроватью полную кружку если захочется пить и пустую если нет ? Это как раз на эту тему.
Каомпиляторы с языков высокого уровня помимо твоего собственного кода кладут в экзешник загрузчик (как я понял ты делал на асме com файлы, а там загрузчик не нужен т.к. всё помещается в один сегмент 64к, значит файл меньше чем exe) , инициализацию переменных, проверку на Windows (открой в нортоне через F3 любой виндовский экзешник и увидишь там: This program must be run under Win32) и прочую лабуду на все случаи жизни. Windows это как ни как ещё и графический интерфейс, поэтому размер файла возрастает значительно. Ещё учти что по умолчанию в экзешник включена отладочная информация, что позволяет связать код с исходным текстом что учень удобно для дебага. Если её отключить то размер упадёт раза в 3.
Чтобы оценить размер ТВОЕГО кода, сранивай размер экзешника твоей программы с размером экзешника пустой программы:
void main() {} |
|
Вернуться к началу |
|
|
Новенький Гость
|
Добавлено: Ср Фев 11 2004 16:52 Заголовок сообщения: ... |
|
|
да я то все это понимаю
но блин такой обьем, никогда бы не подумал...
а все таки почему тогда еще такая разница между 2 компиляторами, один выдает 120 килобайт, а другой всего 10 килобайт? все таки разница в 12 раз
кстати все что я говорю, это все только про консольные приложения!
и еще ну совсем тупой вопрос
на асме все возможно, захотел это, захотел то - видеорежимы, мышка и т.д. - всем можно управлять на самом низком уровне...
а вот на c++ это вообще возможно без асм вставок?
а то я так посмотрел, чего-то этого нигде нет
а в чем тогда фишка то...
наверное дурацкий вопрос |
|
Вернуться к началу |
|
|
Naima
Зарегистрирован: 13.01.2004 Сообщения: 41 Откуда: Kiev
|
Добавлено: Ср Фев 11 2004 18:40 Заголовок сообщения: |
|
|
вопрос совсем не тупой ! а очень даже дельный ... "обьектов специализированных на мышках" на с++ (то что под ДОСом) вроде как нет. Я когдато писал масенький модуль для поддержки мышки, так лепил вставки на ASM. Вернее мне показали на практическом примере как сделать. Если шибко хочешь - давай мыло - покажу
А что касается размеров исполняемых модулей, то при компиляции под винду подключается масса всякой левой хренотени ! почему левой ? - а потому что в твоей программе по логике она совсем может быть и не нужна. короче как говорил GRAYRAT что там Win32 и тд, подключается куча своих модулей, они автоматически включаются в код , а значит размер растёт . |
|
Вернуться к началу |
|
|
GREA
Зарегистрирован: 14.05.2003 Сообщения: 758 Откуда: Новосибирск
|
Добавлено: Ср Фев 11 2004 19:24 Заголовок сообщения: |
|
|
Можно сделать через регистры.
union REGS regs;
int msinit(int Xlo, int Xhi, int Ylo, int Yhi)//Инициализируем мышь
{int retcode;
regs.x.ax = 0;
int86(51, ®s, ®s);
retcode = regs.x.ax;
if (retcode == 0) return 0;
regs.x.ax = 7; regs.x.cx = Xlo; regs.x.dx = Xhi;
int86(51, ®s, ®s);
regs.x.ax = 8; regs.x.cx = Ylo; regs.x.dx = Yhi;
int86(51, ®s, ®s);
return retcode;
}
void msget(int *pX, int *pY, int *pbuttons)//Операции с мышью
{regs.x.ax = 3;
int86(51, ®s, ®s);
*pX = regs.x.cx; *pY = regs.x.dx;
*pbuttons = regs.x.bx;
}
int msread(int *pX, int *pY, int *pbuttons)//Операции с мышью
{static int X0=-1, Y0=-1, but0=-1;
do
{if (kbhit()) return getch();
msget(pX, pY, pbuttons);
}while (*pX == X0 && *pY == Y0 && *pbuttons == but0);
X0 = *pX; Y0 = *pY; but0 = *pbuttons;
return -1;
}
Хотя по своей внутренней реализации - очень похоже на обычный ассеблерский прием. (читай о int86 в хелпе) |
|
Вернуться к началу |
|
|
X-M@n Гость
|
|
Вернуться к началу |
|
|
Новенький Гость
|
Добавлено: Чт Фев 12 2004 11:22 Заголовок сообщения: спасибо! |
|
|
Всем спасибо за ответы! очень нужная инфа!
2Naima:
да, если можно кинь плиз кодик, а то я тут начал делать асм вставки, да чего то они не работают чего то я видимо не так компилирую что ли мыло: godfather@yandex.ru
а вообще c++ меня затягивать сильно начал, книжку аж перед сном читаю, да и асм тут тоже можно использовать! |
|
Вернуться к началу |
|
|
|