مفهوم Data Alignment در C - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مفهوم Data Alignment در C

+2 امتیاز

سلام من این صفحه از MSDN رو خوندم  http://msdn.microsoft.com/en-us/library/ms253949(VS.80).aspx ولی هنوز نفهمیدم alignment یعنی چی !؟ 

An address is said to be aligned to X if its alignment is Xn+0.

منظورش از این که  Alignment  اگر  Xn+0 باشه چیه ؟! 

بعد حالا چطوری میشه یک تابع نوشت که با استفاده از malloc  و با توجه به سایز ورودی مموری align شده برگردونه ؟! (حافظه ۱۶بیتی Align شده باشه )

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

2 پاسخ

+4 امتیاز
 
بهترین پاسخ
data alignment یعنی این که  محل شروع آدرس داده های برنامه مضربی از یک عدد خاص باشه

مثلا align to 16 یعنی این که آدرس ها مضربی از ۱۶ باشن .

دلیل این که alignment خیلی مهمه بخاطر روش عملکرد cpu و نحوه خواندن حافظه هست  . cpu ها اندازه سایز Word که سایز general perpose register ها هم هست هر بار از مموری اطلاعات می خونن .

حالا فرض کنید داخل یک سیستم ۳۲ بیتی که سایز Word چهار بایت هست  شما برای یک int که ۴ بایت هست حافظه گرفتید  حالا اگر آدرس شروع مضرب ۴ نباشه مثلا باشه ۵  پردازنده مجبور میشه یک بار از آدرس ۴-۸ رو بخونه یکبار از آدرس ۸-۱۲ که این یعنی انجام ۲ برابر کار بیشتر که زمان گیر هست و سرعت برنامه ها رو میاره پایین .

البته ما data structure padding هم داریم که با alignment متفاوت هستش padding یعنی این که شما مثلا یک struct دارید که۲۴ بیت حافظه گرفته  این جا کامپایلر میاد ۸ بیت اضافی به آخر این struct اضافه می کنه تا سایز دقیقا مضربی از ۴ بایت یا ۳۲ بیت بشه به این کار padding میگن.

کامپایلر های ++C یا C هم اکثرا alignment و padding رو بصورت خودکار رعایت می کنند .
پاسخ داده شده شهریور 5, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد آذر 6, 1393 بوسیله ی مصطفی ساتکی
+3 امتیاز

سلام ، اینجا رو نگاه کنید : استفاده از Data alignment

برای align کردن malloc هم اینجا رو نگاه کنید : http://man7.org/linux/man-pages/man3/posix_memalign.3.html

اگر خواستید خودتون ۲ تا تابع دیگه بنویسید که و حافظه رو از malloc بگیره و آدرسش رو Align کنید و اشاره گر رو بگردونید .

و موقع آزاد کردن اشاره گر اندازه Align شده رو ازش کم کنید تا آدرس اصلی اشاره گر بدست بیاد و با تابع free آزادش کنید .

پاسخ داده شده شهریور 4, 1393 بوسیله ی Ali Rahbar (امتیاز 4,240)   6 16 46
memalign مخصوص لینوکس هست فقط ؟‌ داخل vs نگاه کردم نیست
memalign برای POSIX هست . یادم نمیاد VC چقدر POSIX رو پشتیباتی میکرد .
برای VC اینجا رو هم ببینید :
http://msdn.microsoft.com/en-us/library/ycsb6wwf.aspx
http://msdn.microsoft.com/en-us/library/8z34s9c6.aspx
...