使用 -O2 编译时,Eigen::Vector2f 未正确初始化

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

我遇到一个问题,如果

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]
initialization g++ eigen
1个回答
0
投票

使用

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();
    
© www.soinside.com 2019 - 2024. All rights reserved.