我正在从 python 移植一种算法,该算法使用一个数组来索引另一个数组。在Python算法中,索引数组中使用-1值作为标志来指示无效数据。我预计这会在 Eigen 中引发断言错误,就像您尝试访问具有越界索引的数组时会发生的那样,但令我惊讶的是,它没有。
这是我遇到的情况的一个简单例子:
Eigen::Array4i values;
values << 0, 1, 2, 3;
Eigen::Array4i values2;
values2 << 0, 1, 2, 3;
Eigen::Array4i indexes;
indexes << -1, -2, -1, -2;
std::cout << values(indexes) << "\n\n";
std::cout << values2(indexes) << "\n\n";
// std::cout << values(-1); //eigen_assert(index >= 0 && index < size()) fails.
哪个输出(都使用调试器和 -O3 标志运行):
0
1
0
1
3
2
3
2
很明显,这不像在 python 中那样工作(不是很令人惊讶),而且它不一致的事实让我认为这可能是返回垃圾值的未定义行为。这引出了我的问题:
我正在使用 Eigen 3.4.0 和 c++17
在 eigen 中使用负索引是未定义的行为,好消息是 gcc 和 clang 中的地址清理程序都可以捕获它,请参阅 godbolt demo 不幸的是 MSVC 地址清理程序无法捕获它。