2015-07-01 3 views

ответ

4

Прежде всего, вы должны понимать, что компилятор vala по умолчанию valac компилируется в C (в качестве исходного кода). Затем код компилируется с использованием компилятора C (обычно gcc).

valac -C example.vala будет компилировать example.c

Таким образом, вы можете проверить Производимый код С себя.

Теперь реальный вопрос:

Vala поддерживает call-by-value и call-by-reference. Это даже немного более мелкозернистый, чем этот.

Возьмем пример, используя простой тип данных C (int).

вызова по значению:

public void my_func (int value) { 
    // ... 
} 

значение будет скопировано в функцию, независимо от того, что вы делаете с value внутри my_func это не повлияет на абонента.

Вызов по ссылке с помощью ref:

public void my_func (ref int value) { 
    // ... 
} 

адрес будет скопирован в функцию. Все, что вы делаете с value внутри my_func, также будет отражено на стороне вызывающего абонента.

Вызов по ссылке с помощью out:

public void my_func (out int value) { 
    // ... 
} 

В основном так же, как ref, но стоимость не должна быть инициализирована перед вызовом my_func.

Для типов данных, основанных на GObject (нестатических классах), он усложняется, поскольку вам необходимо учитывать управление памятью.

Поскольку они всегда управляются с помощью указателей (имплицитно), то ref и модификаторы `out' теперь отражают то, как передается (неявный) указатель.

Он добавляет еще один уровень косвенности, так сказать.

string и типы данных массива также управляются внутренними средствами с использованием указателей и автоматического подсчета ссылок (ARC).

Хотя обескуражен, Вал также делает указатели поддержки, так что вы можете иметь int * или MyClass * так же, как в C.

1

Технически, она проходит по значению, так как исходный код преобразуется в C. Простые типы (числовые типы, булевы, перечисления, флаги) передаются по значению. Строки передаются по ссылке, но поскольку они неизменяемы, они также могут быть переданы по значению.

Однако массивы, объекты и структуры передаются с помощью указателей в C, поэтому они проходят по ссылке. Существуют также модификаторы ref и out для работы с параметрами, которые заставляют эти параметры передаваться по ссылке.

Смежные вопросы