Почему Valac генерирует эти (бессмысленные?) Временные указатели в коде C - PullRequest
0 голосов
/ 06 января 2019

Я начал изучать Vala, и теперь я не понимаю, почему в этих примерах создается переменная tmp1, если можно было сразу использовать tmp0? enter image description here И то же самое с tmp1 tm3 здесь enter image description here

Я немного прочитал документацию, но не понял, почему valac генерирует эти временные указатели. https://wiki.gnome.org/Projects/Vala/Hacking#Documentation

Я действительно хочу понять, как работает компилятор Vala. Теперь я думаю, что он сильно зависит от оптимизации, которая произойдет в gcc с -O3, и, очевидно, он включен по умолчанию. Я попытался скомпилировать с флагом -O3 и без него, и вес двоичных файлов был одинаковым.

1 Ответ

0 голосов
/ 06 января 2019

Основная причина - избегать неопределенного поведения. В C аргументы порядка оцениваются как неопределенные. Например, если у вас есть что-то вроде

int x = 1;
foo(x++, x++);

Вы можете звонить foo(1, 2) или foo(2, 1).

В Вале порядок определен; это будет foo(1, 2). Для этого Vala иногда нужно использовать временные переменные, поэтому код превращается в нечто вроде:

int x = 1;
int tmp0 = x++;
int tmp1 = x++;
foo(tmp0, tmp1);

Чтобы генератор кода был простым, временные переменные просто генерируются.

Любой компилятор C легко оптимизирует временные переменные (вам не нужно -O3, для этого более чем достаточно -O1), поэтому нет особых оснований менять valac для устранения временных переменных. Единственным недостатком является то, что сгенерированный код немного уродливее.

...