ورود

View Full Version : فرق packed record با record چیه؟



A.Nemati
چهارشنبه 21 آذر 1386, 17:41 عصر
سلام
فکر کنم عنوان سوال گویاست.
ممنون.

Hamid_PaK
چهارشنبه 21 آذر 1386, 18:59 عصر
سازه تایپ ها :

Structured types
Instances of a structured type hold more than one value. Structured types include sets, arrays, records, and files as well as class, class-reference, and interface types. Except for sets, which hold ordinal values only, structured types can contain other structured types; a type can have unlimited levels of structuring.

By default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage. For example,

type TNumbers = packed array[1..100] of Real;

Using packed slows data access and, in the case of a character array, affects type compatibility

یا حق ...

ghabil
چهارشنبه 21 آذر 1386, 21:16 عصر
اگر Aligned record fields تیک خورده باشه که بصورت پیشفرض خورده ، هیچ فرقی ندارند ، فقط برای Backward Compaibilty با برنامه هایی که روی دلفی 16 بیتی یا تو پاسکال نوشته شدن هست.

vcldeveloper
چهارشنبه 21 آذر 1386, 22:00 عصر
اگر Aligned record fields تیک خورده باشه که بصورت پیشفرض خورده ، هیچ فرقی ندارند ، فقط برای Backward Compaibilty با برنامه هایی که روی دلفی 16 بیتی یا تو پاسکال نوشته شدن هست.
مطمئنی؟! بعضی جاها لازمه رکورد Pack شده باشه، مثل رکوردهایی که باید در فایل نوشته بشند، تا بیخودی فضای دیسک اشغال نشه. فکر کنم توی برنامه های 32 بیتی هم باید هنوز کاربرد داشته باشه.

ghabil
چهارشنبه 21 آذر 1386, 22:19 عصر
راستش اینطوری فکر میکردم ، وقتی گفتی شک کردم رفتم تست کردم دیدم ساز رکورد Packed و UnPacked فرق کرد ، البته تو دلفی 7 تست کردم و گزینه Alignment رو هم پیدا نکردم ، حالا نمیدونم از قدیما یک چیزایی عوض شده یا من با یک چیز دیگه قاطی کردم !
شاید هم ما بالای همه کدهامون یک {$Align Off} میزاشتیم...

Arman_1367
پنج شنبه 22 آذر 1386, 00:08 صبح
با سلام
دقیقاً همینه علیرضا جان اگر از {$Align Off} استفاده بشه اون وقته که تمام ساختارها به صورت packed شده در نظر گرفته می شود اما در صورتی که از {$Align On} استفاده کنی اون موقع هست که ساختارها متفاوت شده و در سرعت دسترسی و میزان فضای حافظه متفاوت می شوند البته در حالت عادی Align برای کمپایلر on در نظر گرفته میشه یعنی تا دلفی 2007 که من دیده بودم اینجوری بود.

Hamid_PaK
پنج شنبه 22 آذر 1386, 04:34 صبح
در حالت عادی Align برای کمپایلر on در نظر گرفته میشه
بله به گفته Help خود دلفی پیشفرض روشن است.

یا حق ...

A.Nemati
پنج شنبه 22 آذر 1386, 11:07 صبح
Using packed slows data access and, in the case of a character array, affects type compatibility


1- اگه درست فهمیده باشم، استفاده از Packed سازگاری رو بالا می‌بره و سرعت رو پایین میاره، در عین حال مقدار کمتری از حافظه رو اشغال می‌کنه.
2- تا جایی که می‌دونم packed record یک سری قوانین خاص داره. یکیش اینه که باید محدوده متغیرهاش مشخص باشه. مثلا توش نباید از string استفاده کرد و بجاش باید shortstring یا [...]string (محدود شده) استفاده کرد.
اگر قوانین دیگه‌ای هم داره لطفا بگید.
3- حالا از کدوم (record و packed record)، کجا استفاده کنیم بهتره؟

vcldeveloper
پنج شنبه 22 آذر 1386, 17:47 عصر
- اگه درست فهمیده باشم، استفاده از Packed سازگاری رو بالا می‌بره و سرعت رو پایین میاره، در عین حال مقدار کمتری از حافظه رو اشغال می‌کنه.
وقتی داده ها Align نباشند، ارسال آنها به CPU و انجام محاسبه بر روی آنها پیچیده تر و زمان بر تر میشه. مثلا نصف یک متغیر یک بار و نصف دیگرش در بار دوم به CPU ارسال میشه و CPU باید خودش این دو بخش را مجددا با هم ترکیب کند. به همین دلیل هم فیلدهای یک رکورد به صورت Aligned ذخیره میشند. وقتی رکورد را Pack می کنید، بایت های اضافه ایی که برای Align کردن بین فیلدها اضافه شده بودند، پاک می شوند، این کار باعث کاهش حجم رکورد میشه، اما همونطور که گفته شد، کارایی را کاهش می دهد.


- تا جایی که می‌دونم packed record یک سری قوانین خاص داره. یکیش اینه که باید محدوده متغیرهاش مشخص باشه. مثلا توش نباید از string استفاده کرد و بجاش باید shortstring یا [...]string (محدود شده) استفاده کرد.
قوانین خاصی نداره. مواردی را که اشاره کردید، مربوط به همه رکوردها میشه.


- حالا از کدوم (record و packed record)، کجا استفاده کنیم بهتره؟
رکورد معمولی، غیر از آنکه نیاز داشته باشید رکورد را به درگاههای I/O بفرستید، یا آنکه آن را بر روی فایل ذخیره کنید، یا آنکه محدودیت شدید در مقدار حافظه مصرفی داشته باشید.

Delphi Coder
جمعه 23 آذر 1386, 17:08 عصر
نقل قول:
- حالا از کدوم (record و packed record)، کجا استفاده کنیم بهتره؟
رکورد معمولی، غیر از آنکه نیاز داشته باشید رکورد را به درگاههای I/O بفرستید، یا آنکه آن را بر روی فایل ذخیره کنید، یا آنکه محدودیت شدید در مقدار حافظه مصرفی داشته باشید.
یا اینکه Data رو بخواید تو اینترنت منتقل کنید و بخواید از bandwidth استفاده بهینه داشته باشید.

A.Nemati
شنبه 24 آذر 1386, 12:08 عصر
قوانین خاصی نداره. مواردی را که اشاره کردید، مربوط به همه رکوردها میشه.

من رکوردهای زیادی را دیدم که از string در آنها استفاده شده (محدود نشده)!؟

vcldeveloper
شنبه 24 آذر 1386, 15:33 عصر
من رکوردهای زیادی را دیدم که از string در آنها استفاده شده (محدود نشده)!؟
string را می تونید برای هر دو نوع رکورد (packed و معمولی) استفاده کنید، اما اگه از اون رکورد به عنوان type یک فایل استفاده کنید، کامپایلر ازتون ایراد میگیره، چون باید اندازه رکورد مشخص باشه و نوع string محدودیت اندازه نداره.