【问题标题】:Array doesn't change when method inlined内联方法时数组不会改变
【发布时间】:2015-04-28 17:43:59
【问题描述】:

这是我的堆栈类的一部分。它在 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 关键字,它一直都可以正常工作。

内联时生成的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等

【问题讨论】:

  • 这看起来不像 C++。是 C++CLI 还是类似的东西。
  • inline 不应该对功能做任何事情。您是否在线程环境中使用它?线程问题可能表现为不一致的行为
  • 第一位是haxe,其余的是在.cpp文件中,但就像我说的我不知道cpp。我很确定这一切都在一个线程中运行,因为我没有手动线程化任何东西。
  • 您似乎在 Haxe 编译器中发现了一个错误。在不了解 Haxe 实现的内部结构的情况下,看起来内联版本将值添加到了Array副本。考虑向 haxe 团队发布错误报告。
  • @LokiAstari 这是 Haxe,针对 CPP。假设最流行的标签(cpp)是这个问题最重要的标签,这是一种耻辱。对于关注 Haxe 标签的人来说,这个问题是完全合理的,但我可以理解 cpp 上的人的困惑。我不认为投反对票是应得的。

标签: c++ arrays windows haxe hxcpp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多