8

GCCでコンパイルされ、QtとSSEの組み込み関数を使用してプログラムを作成しようとしています。私の関数の1つがQtによって呼び出された場合、スタックの配置が保持されないようです。これが私が何を意味するかを説明するための短い例です:

#include <cstdio>
#include <emmintrin.h>
#include <QtGui/QApplication.h>
#include <QtGui/QWidget.h>


class Widget: public QWidget {
public:
    void paintEvent(QPaintEvent *) {
        __m128 a;
        printf("a: 0x%08x\n", ((void *) &a));
    }
};


int main(int argc, char** argv)
{
    QApplication application(argc, argv);
    Widget w;
    w.paintEvent(NULL); // Called from here, my function behaves correctly
    w.show();
    w.update();
    // Qt will call Widget::paintEvent and my __m128 will not be
    // aligned on 16 bytes as it should
    application.processEvents();

    return 0;
}

出力は次のとおりです。

a: 0x0023ff40 // OK, that's aligned on 16 bytes
a: 0x0023d14c // Not aligned!

構成:

  • Intel Core2
  • WinXP、SP3
  • GCC 4.4(Qt SDK 2010.01に含まれるMing​​w)

Qtmakefileで見たものと同じオプションを使用してサンプルプログラムをコンパイルしようとしました。

-O2 -Wall -frtti -fexceptions -mthreads

、リンクオプション:

-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads

今、私はどの方向に検索するべきかわかりません。ヒントをいただければ幸いです。ありがとう!

ファビアン

4

2 に答える 2

10

このオプション-mstackrealignを使用すると、ソースコードに属性を追加せずにそれを行うことができます。

-mstackrealign エントリでスタックを再調整します。Intel x86では、-mstackrealignオプションは、必要に応じてランタイムスタックを再調整する代替のプロローグとエピローグを生成します。これは、SSE互換性のために4バイトのスタックを維持するレガシーコードと16バイトのスタックを維持する最新のコードの混合をサポートします。個々の関数に適用可能な属性force_align_arg_pointerも参照してください。

GCCドキュメントから)

于 2010-03-06T17:05:42.657 に答える
5
__attribute__((force_align_arg_pointer)) void paintEvent(QPaintEvent *);

それを機能させました!誰かがより良い解決策を持っていますか?

于 2010-03-05T14:40:12.773 に答える