سؤال

أحاول إجراء برنامج تم تجميعه باستخدام GCC واستخدام الجوهارات QT و SSE. يبدو أنه عندما يتم استدعاء إحدى وظائفي بواسطة 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 (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إعادة تنسيق المكدس عند الدخول. على Intel X86 ، سيقوم الخيار -mstackRealign بإنشاء مقدمة وخيبة بديلة تقوم بإعادة تنظيم مكدس وقت التشغيل إذا لزم الأمر. هذا يدعم خلط الرموز القديمة التي تحافظ على كومة محاذاة ذات 4 بايت مع الرموز الحديثة التي تحافظ على مكدس 16 بايت لتوافق SSE. راجع أيضًا السمة force_align_arg_pointer ، قابلة للتطبيق على الوظائف الفردية.

(من عند مستندات دول مجلس التعاون الخليجي)

نصائح أخرى

__attribute__((force_align_arg_pointer)) void paintEvent(QPaintEvent *);

جعلها تعمل! هل لدى أي شخص حل أفضل؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top