avva: (moose)
[personal profile] avva
Some dark corners of C

Набор забавных малоизвестных особенностей C. Самый интересный пример там, на мой взгляд - следующие две функции:
void foo1(int *x, int *y, int *z) {
  *x += *z;
  *y += *z;
}

void foo2(int *x, int *y, int *z) {
  int w = *z;
  *x += w;
  *y += w;
}


Если хотите - подумайте сами, почему компилятор генерирует более эффективный код для второй из них, foo2, перед тем, как прочитать ответ.

Правильный ответ: в первом случае компилятор не может исключить возможность того, что x==z.

Я также не знал, что в C99 есть ключевое слово restrict, которое решает эту проблему.

Date: 2013-03-10 04:36 pm (UTC)
From: [identity profile] huzhepidarasa.livejournal.com
Нет, не показывает. Он показывает, если он что-то показывает, что программист, не задумываясь, вносит «оптимизации», меняющие смысл программы. А компилятор нет.

Date: 2013-03-10 04:54 pm (UTC)
From: [identity profile] migmit.livejournal.com
Ну как — не показывает. Если от привычки не отказываться, то в подобную ловушку не попадаешь.

Другой вопрос, что, опять-таки, для меня основной критерий — это не тупость компилятора, а "некрасиво".

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 10:44 am
Powered by Dreamwidth Studios