fk0, легенда (23.03.2012 22:05 - 22:10, просмотров: 188) ответил blackbit на ..не льсти себе. Скорее всего другие делают тоже самое другим способом, поэтому глюк у них не вылезает. Я как-то приводил пример в этом разделе для С++ под 18-е пики.
Показываю:
static void f1(const char *s, const char *v)
{
... code
printf("%s,%s", s, v);
}
void f2(char *z)
{
char *x;
static const char m[]="XXXXXXX";
...
x=malloc(sizeof(m));
memcpy(x, m, sizeof(m));
f1(z, x);
...
}
Функция f1() с опцией -Os автоматически инлайнится в f2 (потому, что static). Параметры, как если бы не инлайнилась, в W0 и W1. Практически первой (третьей) командой в f1 обнуляется W0 без попытки куда-либо его сохранить. В f2 код уже "оптимизирован" и W0 больше нигде не хранится... Короче не работает. Но что здесь нетрадиционного?
К слову, после -Os (до этого было -O1) получил сходу assert'ы в разных местах. Причину теперь понимаю. Да, ещё имел необъяснимые глюки при насильном inline. Теперь тоже догадываюсь. Скорей, при выполнении любого inline компилятор плохо (не)следит за переменными в регистрах. Предположение: он внешнюю функцию оптимизирует после внутренней или что-то в этом роде. Ибо дальше (printf("%s,%s", s, v)) выпечатывает не из W0.
Другие не используют malloc, не используют printf, не используют -Os может быть? Или не объявляют функции static?
[ZX]