И вы, очевидно, заинтересованы только в том, чтобы давать мне «советы» в духе «выбросить в окно другие, гораздо более важные соображения и делать то, что я говорю», а не пытаться ответить на вопрос.

леднее время я встречал много функций, где 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: Я должен был упомянуть для начала: эти функции не могут быть встроены. У них есть внешняя связь, и они - код библиотеки. Если их включить в приложение, это приведет к возникновению всевозможных проблем.

Ответы на вопрос(5)

Ваш ответ на вопрос