Jest to część mojej klasy stosu. Działa dobrze w trybie flash, ale w cpp/windows metoda push nie zawsze działa. Nie rozumiem C++ na tyle dobrze, aby zrozumieć, dlaczego może to być niespójne.Tablica nie zmienia się, gdy metoda jest wstawiona
var arr:Array<T>;
public var length(default, null):Int;
public function new() {
clear();
}
public inline function clear():Void {
arr = [];
length = 0;
}
public inline function push(t:T):Void {
// Log.trace(arr) -> []
arr[length++] = t;
// Log.trace(arr) -> []
}
Kiedy push
jest inlined, coś stack.push(0)
nie zawsze zmienić tablicę, jak jego prawdziwa długość jest ustalona na 0 (zmienna length
robi wzrost, jednak). Innym razem działa dobrze. Jeśli usunę słowo kluczowe inline
, będzie ono działało bez zarzutu.
Wygenerowany CPP gdy inlined (zastępując stack.push(0)
):
::msg::utils::Stack tmp = this->stack;
::msg::utils::Stack _this = tmp;
Array<int> tmp1 = _this->arr;
int tmp2 = (_this->length)++;
tmp1[tmp2] = (int)0;
A kiedy nie inlined (wewnątrz push()
):
Dynamic tmp = this->arr;
int tmp1 = (this->length)++;
Dynamic tmp2 = t;
hx::IndexRef((tmp).mPtr,tmp1) = tmp2;
Czy coś mi brakuje, że C++ robi? Dlaczego zainicjowany kod działa przez większość czasu, ale nie działa w innym czasie?
Najnowsze haXe, hxcpp, openfl itp
To nie wygląda na C++. Czy to jest CLI C++ czy coś takiego. –
To naprawdę nie jest C++. –
inline nie powinien nic robić. Czy używasz tego w środowisku z wątkami? Problemy z wątkami mogą pojawiać się jako niespójne zachowanie. – Jay