Робърт Любовта - разработване на ядрото на Linux - страница 125
овъгляване лисица; / * 1 байт * /
U8 __pad1; / * 1 байт * /
Имайте предвид, че израз на sizeof (foo_struct) се равнява на стойността на 12 за всеки един случай, на тази структура за по-голямата част от 32-битови хардуерни платформи. С компилатор автоматично добавя пълначни елементи за да се осигури необходимото привеждане в съответствие.
Често това е възможно, за да пренаредите структурата на областта, така че да се избегне необходимостта да се запълни. Това позволява правилно приведено в съответствие с получаване на данни, без да въвеждат допълнителни елементи и запълване, съответно, структурата на по-малък размер.
Struct животински структура
неподписан дълго котка; / * 4 байта * /
неподписан кратко прасе; / * 2 байта * /
овъгляване куче; / * 1 байт * /
овъгляване лисица; / * 1 байт * /
Тази структура на данни е с площ от 8 байта. Въпреки това, има не винаги е възможност за преместване на компоненти места структура и определяне на промените в структурата. Например, ако структурата се доставя в рамките на стандарта, или вече се използва в съществуващия код, редът на полета не може да бъде променено. Понякога, по някаква причина, може да се наложи специална заповед на полетата на структурата, като например специален изравняване на променливи, за да се оптимизира кеш. Имайте предвид, че съгласно стандарта ANSI C, компилаторът трябва никога промените реда на полета в структури [95] данни - това право има само един програмист.
Ядрото разработчиците трябва да вземат под внимание особеностите на попълване на обмена на структури от данни: прехвърлянето на структури по мрежа или директно спестяване на диск, поради необходимостта да се запълни може да бъде различна за различните хардуерни платформи. Това е една от причините, поради които в езика за програмиране на C не е структури сравнение на оператора. Памет, която се използва за попълване на структурите от данни може да съдържа случайна информация, което прави невъзможно байт по байт сравнение на структури. Разработчиците език, C програмиране с право, че не остави никакво решение на проблема на сравнителни структури по преценка на програмист, който може да създаде за сравнение на техните функции във всеки отделен случай, за да използвате функциите на строителството на бетонни конструкции.
Байт поръчка
Endianness (байт поръчка) - това е последователността, в която са разположени байтове в словото на машината. За различните процесори може да се използва от два типа машина дума байт номерация:-малко значима (най-маловажният) байт е или първия (най-лявата, най-лявата), или на последна (най-добре, най-дясната) в думата. Редът на байт се нарича обратна (голям къс), ако е най-значимият (най-важния) байт се съхранява на първо място, следван от байтове са в реда на важност. Процедурата се нарича директен байта (малко-къс), ако е най-маловажният (най-маловажният) байт се съхранява на първо място, следван от байтове във възходящ ред на важност.
Не се опитвайте да се разчита на някакви предположения за реда на байта, когато пишете код на ядрото (разбира се, ако кодът не е предназначен за конкретна хардуерна платформа). Операционната система Linux поддържа хардуерни платформи и с двете байт ред, включително тези, които използват реда байт може да бъде конфигуриран по време на зареждане на системата, както и общи код трябва да е съвместима с всеки байт ред.
Фиг. 19.1 показва пример на обратен ред на байта, и Фиг. 19.2 - директен байт ред.
Фиг. 19.1. Reverse (голям къс) байт поръчка
Фиг. 19.2. Direct (малко-къс) байт поръчка
i386 използва директно хардуерна платформа (малко-къс) байт. Повечето други хардуерни платформи обикновено използва обратната (голям къс) ред.
Имайте предвид, че тези видове кодиране обозначени на практика и тя изглежда като двоичното представяне на 1027 се съхранява като цяло число тип данни четири байта.
00000000 00000000 00000100 00000011
Вътрешният представяне на броя в паметта използва напред и назад endianness са различни, както е показано в таблица. 19.3.
Таблица 19.3. Местоположение на данни в паметта за различни endianness