ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
317135 Топик полностью
fk0, легенда (23.03.2012 22:05 - 22:10, просмотров: 165) ответил 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]