6

これは私のスタック クラスの一部です。フラッシュでは問題なく動作しますが、cpp/windows ではプッシュ メソッドが常に機能するとは限りません。私は、C++ が矛盾している理由を理解できるほど 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キーワードを削除すると、常に正常に機能します。

インライン化されたときに生成された cpp ( を置き換える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;

インライン化されていない場合 (内部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 に答える