LINUX.ORG.RU

C, оптимизация.


0

0

Исполняемый файл простого примера программы, использующей SDL, занимает больше 400 Кбайт.
Мне кажется, это не нормально.

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

Как этого можно избежать?
Как оптимизировать программы?

ну ты же написал опцию типа
`sdl-config --cflags --libs`

все нормально

kto_tama ★★★★★
()

Два вопроса:
1) Ты компоновал свою программу со статической или динамической libsdl?
2) Делал strip на бинарник своей программы?

Deleted
()

> занимает больше 400 Кбайт. Мне кажется, это не нормально.

У меня обоина на рабочем столе весит 520 Кбайт. Угадай, сколько будут весить текстуры и звуки от твоей игрушки? Мне кажется, это нормально.

> Как этого можно избежать?


С какой целью?

> Как оптимизировать программы?


Преждевременная оптимизация - зло. Это аксиома.

Думай лучше о функционале, тестопригодности, трудоемкости поддержки, масштабируемости.

Manhunt ★★★★★
()

Вывод "sdl-config --cflags":
"-I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT".


Кажется, использовались "статичные" "библиотеки".

Посмотрел, исправил "символьную ссылку", и теперь "скомпилировалось" и без "-ldl -lm", и размер - ~7 Кб.

Если делать "strip -s" на прежнем результате, то сокращает на ~50 Кб.


Но вопрос в другом:
как оптимизировать и можно ли?

Например, код:
#include <stdio.h>

int funct()
{
return 0;
}

int main(int argc, char *argv[])
{
return 0;
}

результат: 6545 байт.
А если убрать первую функцию, то 6507 байт.

Как сделать так, чтобы неиспольуемые функции не включались в результат?


>Угадай, сколько будут весить текстуры и звуки от твоей игрушки?


Там не было ни того, ни другого.

alias-10st
() автор топика
Ответ на: комментарий от alias-10st

>>Угадай, сколько будут весить текстуры и звуки от твоей игрушки?

>Там не было ни того, ни другого.


Речь о том, что 400 Кб кода на фоне десятков мегабайт прочего контента ни на что не повлияют. Сконцентрируйся лучше на игровом процессе. Как его организовать, чтобы играть было увлекательно? Имплементируй. Отладь. После этого можно будет оглянуться и решить, нужна ли вообще оптимизация, и если нужна, то какая именно.

Manhunt ★★★★★
()
Ответ на: комментарий от alias-10st

>int funct() { return 0; }

linkage по дефолту - extern. Это значит что эта функция должна быть доступна извне из любого другого .c файла. Компилятор не имеет возможности просмотреть все исходники.

>Как сделать так, чтобы неиспольуемые функции не включались в результат?

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

Absurd ★★★
()

> Исполняемый файл простого примера программы, использующей SDL, занимает больше 400 Кбайт. > Мне кажется, это не нормально.

Тебе жалко 400Кб?

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

>Это задача линкера.

Так можно как-то оптимизировать?

alias-10st
() автор топика
Ответ на: комментарий от imp

>>Как сделать так, чтобы неиспольуемые функции не включались в результат?

>Это задача линкера.

ЕМНИП, чтобы линкер мог (хотя бы теоретически) эту задачу решить, нужно включить опцию компилятора -ffunction-sections. Иначе он сможет только выбросить лишние .o из .a. А вообще лучше не забывать писать static перед функциями, которые не нужны снаружи, тогда компилятор сам допрёт убрать лишнее и заинлайнить мелочь. Кстати, а зачем писать ненужные функции?

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

>Речь о том, что 400 Кб кода на фоне десятков мегабайт прочего контента ни на что не повлияют.

Повлияют, если встанет вопрос влезет/не влезет в кеш процессора :)

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

> Повлияют, если встанет вопрос влезет/не влезет в кеш процессора :)

Кэш инструкций? Там надо будет уменьшать размер "горячего" участка кода, и неиспользуемые процедуры этому особо не мешают.

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

> man gzexe Это конечно радикально.

Лучше upx =).

Deleted
()
Ответ на: комментарий от alias-10st

> Как сделать так, чтобы неиспольуемые функции не включались в результат?

Все функции, локальные для конкретной единицы трансляции, должны быть static. Либо __attribute__(visibility("hidden")).

Если лень ставить static, смотрите в сторону --combine -fwhole-program.

Ну или передавайте gcc в параметрах -ffunction-sections -Wl,--gc-sections (только если Вы уверены, что это действительно нужно).

sjinks ★★★
()

мне кажется ты смотришь на не стрипнутый файл. вот, для наглядности...

fantom@halturin:~/devel/Projects/gsql/libgsql/.libs$ ls -la /libgsql.so.0.0.0
-rwxr-xr-x 1 fantom fantom 587595 2009-08-25 11:23 ./libgsql.so.0.0.0

fantom@halturin:~/devel/Projects/gsql/libgsql/.libs$ file ./libgsql.so.0.0.0
./libgsql.so.0.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped

fantom@halturin:~/devel/Projects/gsql/libgsql/.libs$ strip ./libgsql.so.0.0.0

fantom@halturin:~/devel/Projects/gsql/libgsql/.libs$ file ./libgsql.so.0.0.0
./libgsql.so.0.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, stripped

fantom@halturin:~/devel/Projects/gsql/libgsql/.libs$ ls -la ./libgsql.so.0.0.0
-rwxr-xr-x 1 fantom fantom 175812 2009-08-25 11:24 ./libgsql.so.0.0.0

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