Утверждения выравнивания собственной среды выполнения с членами структуры на g cc 9.3 с C ++ 17 - PullRequest
1 голос
/ 03 августа 2020

Я получаю утверждения выравнивания времени выполнения с Eigen 3.3.7, компилируемые с g cc версии 9.3 и -std=c++17 -O0.

#include <Eigen/Dense>

struct axis_result                          // <-- Asserting from here
{
    ...
    double              cal_maximum_time;
    Eigen::Vector2d     unit_vector;
    bool                has_error;
    ...
};

class cal_axis_diagnostics
{
    ...
public:
    cal_axis_diagnostics() {}               // <- In stack-frame
    ...
private:
    ...
    axis_result axis_;
    ...
};

int main(int argc, char** argv)
{
    ...
    auto cal = new cal_axis_diagnostics();  // <- In stack-frame
    ...
}

Утверждение времени выполнения указывает мне на http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html, в котором говорится, что проблема должна исчезнуть с достаточно свежим компилятором (G CC> = 7 с C ++ 17). Очевидно, это не мой случай. 1016 * классам, имеющим axis_result членов.

Есть предложения?

Изменить: Я выяснил, что неявное построение axis_ (которое содержит тип Eigen) вызывает проблему. Каким-то образом G CC обходит механизмы выравнивания Eigen, если разрешено неявное построение axis_. Явное добавление axis_ в список инициализаторов устраняет проблему:

class cal_axis_diagnostics
{
    ...
public:
    cal_axis_diagnostics()
    : axis_{}                             // <- Note explicit construction
                                          //    of axis_ in initializer list
    {}
    ...
private:
    ...
    axis_result axis_;
    ...
};
...