6

这是我的堆栈类的一部分。它在 flash 中工作正常,但在 cpp/windows 中,push 方法并不总是有效。我对 C++ 的理解不够好,无法理解为什么它可能不一致。

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) -> []
}

push被内联时,类似的东西stack.push(0)并不总是改变数组,就像它的真实长度固定为 0(但是length变量确实增加了)。其他时候,它工作正常。如果我删除inline关键字,它会一直正常工作。

内联(替换stack.push(0))时生成的 cpp:

::msg::utils::Stack tmp = this->stack;
::msg::utils::Stack _this = tmp;
Array< int > tmp1 = _this->arr;
int tmp2 = (_this->length)++;
tmp1[tmp2] = (int)0;

当没有内联时(内部push()):

Dynamic tmp = this->arr;
int tmp1 = (this->length)++;
Dynamic tmp2 = t;
hx::IndexRef((tmp).mPtr,tmp1) = tmp2;

有什么我错过了 C++ 的东西吗?为什么内联代码大部分时间都可以工作,但其他时候却不工作?

最新haxe、hxcpp、openfl等

4

1 回答 1

2

这是一个 haxe/hxcpp 错误。我将其简化为基本情况,事实证明,如果您将数组变量设置为一个新实例,它现在才能正常工作,而我在其他地方不小心这样做了。

https://github.com/HaxeFoundation/haxe/issues/4187

于 2015-04-30T06:32:41.410 回答