_CRT_ALIGN در آنیون - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

_CRT_ALIGN در آنیون

+2 امتیاز

سلام دوستان من متوجه نمیشم این کد یعنی چی ؟

typedef union __declspec(intrin_type) _CRT_ALIGN(32) __m256 {
    float m256_f32[8];
} __m256;

 

سوال شده شهریور 4, 1393  بوسیله ی OptiMan (امتیاز 124)   2 9 16

1 پاسخ

+4 امتیاز
 
بهترین پاسخ

این یک union ی هست که یک XMM Register از SSE رو توصیف میکنه .

که ( declspec(intrin_type__ رو فک میکنم فقط کامپایلر MSVC داره که خودشون برای خودشون درست کردن و کاربرد عمومی نداره و جایی هم در موردش توضیحی نیست .

کامپایلر MSVC‌ ندارم نمیدونم CRT_ALIGN چطوری تعریف شده ولی خب CRT_ALIGN  یک ماکرو هست که احتمالا از

( (...) declspec(align__ یا هرچیزی شبیه به این استفاده میکنه .

پاسخ داده شده شهریور 4, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
انتخاب شد شهریور 4, 1393 بوسیله ی OptiMan
سلام ممنون بابت پاسخ .
مگه آرایه 8 تایی از float داخلش alignment رعایت نمیشه ؟ پس چرا از این ماکرو استفاده شده _CRT_ALIGN(32)  ؟
دلیلش اینه که ، فایل های header دیگه ای که پیش فرض Alignment کامپایلر رو تغییر میدن ( مثلا با استفاده از pragma pack# یا هر چیز دیگه ای) روی Alignment های بعدی هم تاثیر میزارند . مثلا شما یک فایل دیگه رو قبل از این
فایل مربوط به SSE توی برنامه include کردید که اون فایل Alignment پیش فرض رو به 64 تغییر داده .
و اگر Alignment پیش فرض 64 باشه و این union هم با 64 Alignemnt میشه .
و چیزی که مد نظر اونها برای این union بوده رو خراب میکنه .
پس با استفاده از CRT_ALIGN_ میان Alignment این union رو 32 میکنن تا اگر یه موقع Alignment پیش فرض کامپایلر غیر از 32 بود روی این union تاثیری نزاره .
...