質問
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!
構成:
- インテルコア2
- WinXP、SP3
- GCC 4.4 (Mingw は Qt SDK 2010.01 に含まれています)
Qt makefile で見たものと同じオプションを使用してサンプル プログラムをコンパイルしようとしました。
-O2 -Wall -frtti -fexceptions -mthreads
,リンクオプション:
-enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads
さて、どの方向に検索すればよいのかわかりません。ヒントをいただければ幸いです。ありがとう!
ファビアン
解決
あなたはあなたのソースコードに属性を追加することなく、それを行うには、オプション-mstackrealign
を使用することができます:
-mstackrealign のの エントリでのスタックを再調整。インテルx86では、-mstackrealignオプションが必要な場合は、ランタイム・スタックを再調整代替プロローグとエピローグを生成します。この支持体は、SSEとの互換性のための16バイトのスタックを保つ近代的なコードに4バイト整列スタックを保つレガシーコードを混合します。また、個々の機能に適用される属性force_align_arg_pointerを参照してください。
(GCCドキュメントをから)
他のヒント
__attribute__((force_align_arg_pointer)) void paintEvent(QPaintEvent *);
は、それが動作しました!誰もがよりよい解決策を持っていますか?
所属していません StackOverflow