Отговори на тема  [ 6 мнения ] 
Packed и aligned (GNU) 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение Packed и aligned (GNU)
Извинявам се за тъпия вероятно въпрос, но някой би ли могъл да обясни какво все пак е значението на тези атрибути.

__attribute__ ((aligned (..)))
__attribute__ ((packed))

Четох го. Но не го схващам :oops: :oops:


Сря Окт 08, 2008 4:25 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
Някои (повечето текущи май) архитектури не позволяват неподравнен (unaligned) достъп до паметта. Съответно членовете на C структура не могат да бъдат плътно един до друг а се налага да започват на подравнени (aligned) адреси.

С прагма "(aligned)" инструктираш компилатора да разположи членовете на структурата на подравнени адреси. Тя би трябвало да си е default така или иначе и я има за да отмени евентуално другата.

С прагма "(packed)" караш компилатора да пакетира членовете един след друг, което значи че при архитектурите неподдържащи неподравнен (unaligned) достъп няма да можеш да ги ползваш директно. Използва се когато трябва да прочетеш някаква чуждо наложена структура (примерно хедър на някакъв тип файл) и после полетата си ги взимаш едно по едно със специално направени от теб функции които събират байтовете един по един и сглабят по-големите членове като int32.

При x86 можеш да ползваш неподравнен (unaligned) достъп, като цената ти е само бързодействие.


Сря Окт 08, 2008 8:29 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Май схванах... мерси! Напр. 32 битова на платформа без неподравнен достъп, всички членове на структурата трябва да започват от адрес, кратен на 4, без значчение колко място заемат самите те? А за масив от char? А ако архитектурата поддържа неподравнен достъп (побайтов), подреждането по подразбиране би трябвало да е packed, което е същото като align (1), нали... или се обърках някъде :oops:


Чет Окт 09, 2008 5:46 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение 
setoy написа:
Напр. 32 битова на платформа без неподравнен достъп, всички членове на структурата трябва да започват от адрес, кратен на 4, без значчение колко място заемат самите те?


Не, само тези които искат подравняване 2^2. Това са 32-битови, 64-битови и т.н.
16-битовите ще са с подравняване 2^1.

setoy написа:
А за масив от char?


Подравняване 2^0.

setoy написа:
А ако архитектурата поддържа неподравнен достъп (побайтов), подреждането по подразбиране би трябвало да е packed, което е същото като align (1), нали... или се обърках някъде :oops:


По-скоро не, защото при подравняване align(1) == packed ще ти замине скоростта. :) Това е въпрос кое е "default" за конкретния компилатор, и е почти сигурно да е "aligned" отколкото "packed".

Код:
struct {
        char c0[3];
        int i;
        char c1[3];
        short int s;
} x;


16 байта за нормален (aligned) и 12 байта за пакетиран (packed)


Чет Окт 09, 2008 11:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
С aligned се печели скорост, с packed се печели памет. :) Съответно ти си преценяваш кое ти е по-важно за конкретната задача. По принцип никъде не съм виждал да се задават по отделно за всяка структура, обикновено е опция на компилатора.


Пет Окт 10, 2008 10:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
Реконструктор написа:
... По принцип никъде не съм виждал да се задават по отделно за всяка структура, обикновено е опция на компилатора.


напротив, при компилаторите обикновенно се използва директивата #pragma ...
packed е изключително полезно при комуникации м/у различни платформи - гарантира ти че структурата ще е еднаква независимо от опциите на компилатора/особенностите на платформата ... (освен че спестява място - което не винаги е най-важното!)

_________________
путинофили: "иди н***й"


Пет Окт 10, 2008 10:12 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: Google [Bot] и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни