И вы, очевидно, заинтересованы только в том, чтобы давать мне «советы» в духе «выбросить в окно другие, гораздо более важные соображения и делать то, что я говорю», а не пытаться ответить на вопрос.
леднее время я встречал много функций, где gcc генерирует действительно плохой код на x86. Все они соответствуют шаблону:
if (some_condition) {
/* do something really simple and return */
} else {
/* something complex that needs lots of registers */
}
Думайте о простом случае как о чем-то настолько маленьком, что половина или больше работы тратятся на загрузку и запись регистров, которые вообще не будут изменены. Если бы я писал asm вручную, я бы сохранял и восстанавливал регистры сохраненных вызовов в сложном случае, и в простом случае вообще не касался указателя стека.
Есть ли способ заставить gcc быть немного умнее и сделать это самому? Желательно с опциями командной строки, а не безобразными хаки в источнике ...
Редактировать: Чтобы конкретизировать, вот что-то очень близкое к некоторым функциям, с которыми я имею дело:
if (buf->pos < buf->end) {
return *buf->pos++;
} else {
/* fill buffer */
}
и еще один:
if (!initialized) {
/* complex initialization procedure */
}
return &initialized_object;
и другой:
if (mutex->type == SIMPLE) {
return atomic_swap(&mutex->lock, 1);
} else {
/* deal with ownership, etc. */
}
Изменить 2: Я должен был упомянуть для начала: эти функции не могут быть встроены. У них есть внешняя связь, и они - код библиотеки. Если их включить в приложение, это приведет к возникновению всевозможных проблем.