| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Packed и aligned (GNU) http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6160 |
Страница 1 от 1 |
| Автор: | setoy [ Сря Окт 08, 2008 4:25 pm ] |
| Заглавие: | Packed и aligned (GNU) |
Извинявам се за тъпия вероятно въпрос, но някой би ли могъл да обясни какво все пак е значението на тези атрибути. __attribute__ ((aligned (..))) __attribute__ ((packed)) Четох го. Но не го схващам |
|
| Автор: | woody [ Сря Окт 08, 2008 8:29 pm ] |
| Заглавие: | |
Някои (повечето текущи май) архитектури не позволяват неподравнен (unaligned) достъп до паметта. Съответно членовете на C структура не могат да бъдат плътно един до друг а се налага да започват на подравнени (aligned) адреси. С прагма "(aligned)" инструктираш компилатора да разположи членовете на структурата на подравнени адреси. Тя би трябвало да си е default така или иначе и я има за да отмени евентуално другата. С прагма "(packed)" караш компилатора да пакетира членовете един след друг, което значи че при архитектурите неподдържащи неподравнен (unaligned) достъп няма да можеш да ги ползваш директно. Използва се когато трябва да прочетеш някаква чуждо наложена структура (примерно хедър на някакъв тип файл) и после полетата си ги взимаш едно по едно със специално направени от теб функции които събират байтовете един по един и сглабят по-големите членове като int32. При x86 можеш да ползваш неподравнен (unaligned) достъп, като цената ти е само бързодействие. |
|
| Автор: | setoy [ Чет Окт 09, 2008 5:46 pm ] |
| Заглавие: | |
Май схванах... мерси! Напр. 32 битова на платформа без неподравнен достъп, всички членове на структурата трябва да започват от адрес, кратен на 4, без значчение колко място заемат самите те? А за масив от char? А ако архитектурата поддържа неподравнен достъп (побайтов), подреждането по подразбиране би трябвало да е packed, което е същото като align (1), нали... или се обърках някъде |
|
| Автор: | woody [ Чет Окт 09, 2008 11:26 pm ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | |||||||||||||||||||||||||||||||||||||
Не, само тези които искат подравняване 2^2. Това са 32-битови, 64-битови и т.н. 16-битовите ще са с подравняване 2^1.
Подравняване 2^0.
По-скоро не, защото при подравняване align(1) == packed ще ти замине скоростта.
16 байта за нормален (aligned) и 12 байта за пакетиран (packed) |
|||||||||||||||||||||||||||||||||||||
| Автор: | Реконструктор [ Пет Окт 10, 2008 10:00 am ] |
| Заглавие: | |
С aligned се печели скорост, с packed се печели памет. |
|
| Автор: | ps66 [ Пет Окт 10, 2008 10:12 am ] | |||||||||
| Заглавие: | ||||||||||
напротив, при компилаторите обикновенно се използва директивата #pragma ... packed е изключително полезно при комуникации м/у различни платформи - гарантира ти че структурата ще е еднаква независимо от опциите на компилатора/особенностите на платформата ... (освен че спестява място - което не винаги е най-важното!) |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|