为什么在 Eigen 中使用负索引数组进行索引不会引发断言错误?

问题描述 投票:0回答:1

我正在从 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 中那样工作(不是很令人惊讶),而且它不一致的事实让我认为这可能是返回垃圾值的未定义行为。这引出了我的问题:

  1. 为什么这不会引发断言错误?
  2. 这种返回(可能是垃圾值)而不是引发错误或段错误的行为可靠吗?在我的程序中,由于 -1 值已经表示无效数据,所以我实际上并不关心索引返回的内容,因为无论如何我都会在稍后将其屏蔽掉。

我正在使用 Eigen 3.4.0 和 c++17

c++ c++17 eigen eigen3
1个回答
0
投票

在 eigen 中使用负索引是未定义的行为,好消息是 gcc 和 clang 中的地址清理程序都可以捕获它,请参阅 godbolt demo 不幸的是 MSVC 地址清理程序无法捕获它。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.