0

次のコードがあります。

#include <Eigen/Dense>

struct States 
{
    // Eigen::VectorXd v;
    Eigen::VectorXd v{Eigen::VectorXd::Ones(2)};

    States() {
        // v.resize(2);
        // v << 1, 1;
    }
};

States st;

int main() {}

Solaris 11 (g++4.9 を使用) でプロジェクトを最適化せずにビルドすると、実行時に segfault (コア ダンプ) が発生します。掘り下げて段階的なデバッグを行った後、問題のある行は DenseCoeffBase.hfunction 内copyPacketの 、つまり行 537にあると思います

derived().template writePacket<StoreMode>(index, 
  other.derived().template packet<LoadMode>(index));

コンパイル/実行に使用したコマンドライン:g++ -std=c++11 -I ./eigen_3.2.2 example.cpp; ./a.out

いくつかのコメント:

  • 宣言States st;を 内に移動するmain()と、機能し、segfault は発生しません。
  • vinの宣言をコメント解除しStates、C++ 11 スタイルの初期化をコメント化してからv.resize(2); v << 1, 1;、コンストラクター内で使用すると、機能します
  • -O2または-O3最適化を使用すると、機能します。
  • 私がテストした他のすべてのプラットフォーム (Ubuntu 14.04、Debian7、OS X 10.10) では、最適化レベルに関係なく動作します
  • この問題は、g++4.9 の下で、最適化されていない Solaris でのみ発生するようです。

私が持っている質問は次のとおりです。

  1. 私が書いたコードは正しいですか?つまり、クラス内の初期化スタイルを安全に使用できC++11ますか、それともベクトルを宣言してからコンストラクターでサイズを変更する必要がありますか?

  2. 私のコードが正しい場合、誰かがこの問題に遭遇しましたか? (私はそれが非常にありそうもないことを知っていますが、それでも私は尋ねます:))

PS: 私は Eigen 3.2.2 を使用しています (ただし、この問題は 3.2.1 でも発生します)

Solaris11でプログラムをビルド/実行できるかどうか教えていただければ幸いです(コンパイラに関係なく)

4

0 に答える 0