代码之家  ›  专栏  ›  技术社区  ›  Kota

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

  •  0
  • Kota  · 技术社区  · 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) 编译时未进行优化,但不使用 -氧气 旗帜

    w/o优化

    > 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和Eigen 3.3上使用g++9.4.0。

    g++ (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0
    libeigen3-dev/focal,focal,now 3.3.7-2 all [installed,automatic]
    
    0 回复  |  直到 1 年前
        1
  •  2
  •   chtz    1 年前

    正在初始化,使用 Eigen::Vector2f(x.x(), x.y()) + delta 没有问题,但如果将其分配给 auto 表达式,您有一个依赖于临时的表达式模板。请参阅 C++11 and the auto keyword 常见的特征陷阱部分。

    要使代码正常工作,请编写

    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();