我遇到一个问题,如果
Eigen::Vector2f
与其他操作一致初始化并进行编译,则无法正确初始化它。带有 -O2
标志。
main.cpp
#include <Eigen/Core>
#include <iostream>
int main(int argc, char** argv) {
const auto x = Eigen::Vector2f(1.0, 2.0);
const auto delta = Eigen::Vector2f(0.1, 0.2);
const auto add_1 = x + delta;
const auto add_2 = Eigen::Vector2f(x.x(), x.y()) + delta;
std::cout << "x: " << x.x() << ", " << x.y() << std::endl;
std::cout << "delta: " << delta.x() << ", " << delta.y() << std::endl;
std::cout << "add_1: " << add_1.x() << ", " << add_1.y() << std::endl;
std::cout << "add_2: " << add_2.x() << ", " << add_2.y() << " <-- " << std::endl;
return 0;
}
对于
add_2
,在未经优化的情况下编译时,Eigen::Vector2f(x.x(), x.y())
会初始化为 (1.0, 2.0)
,但不带 -O2
标志。
无优化
> g++ $(pkg-config --cflags eigen3) main.cpp; ./a.out
x: 1, 2
delta: 0.1, 0.2
add_1: 1.1, 2.2
add_2: 1.1, 2.2 <--
与 O2
g++ $(pkg-config --cflags eigen3) -O2 main.cpp; ./a.out
x: 1, 2
delta: 0.1, 0.2
add_1: 1.1, 2.2
add_2: 9.97967e+33, 0.2 <--
初始化为
Eigen::Vector2f(x.x(), x.y()) + delta
官方不支持吗?
我在 ubuntu 20.04 上使用 g++ 9.4.0 和 Eigen 3.3。
g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
libeigen3-dev/focal,focal,now 3.3.7-2 all [installed,automatic]
使用
Eigen::Vector2f(x.x(), x.y()) + delta
初始化没有问题,但如果将其分配给 auto
表达式,则您将拥有一个依赖于临时变量的表达式模板。请参阅常见 Eigen 陷阱的 C++11 和 auto 关键字部分。
要使您的代码正常工作,请编写以下任一内容
Eigen::Vector2f const add_2 = Eigen::Vector2f(x.x(), x.y()) + delta;
// or
auto const add_2 = (Eigen::Vector2f(x.x(), x.y()) + delta).eval();