Data structure alignment (original) (raw)
- Zarovnání paměti je způsob uspořádání a zpřístupnění dat v paměti počítače. V této souvislosti se používají dva příbuzné pojmy: zarovnání dat a data structure padding. Data structure padding by se do češtiny dalo přeložit jako vkládání vaty (vycpávky či výplně). Když moderní počítače zapisují nebo čtou data z RAM, pracují s blokem dat o konstantní velikosti (například u 32bitových operačních systémů se jedná o blok dat s velikostí 4 bajty). Tento blok dat se označuje pojmem slovo (používá se i anglický výraz word). Zarovnání dat znamená umístit data o velikosti slova v paměti na takovou pozici, která je rovna násobku velikosti slova. To zlepšuje výkon celého systému vzhledem ke způsobu, jakým procesor pracuje s pamětí. Pro správné zarovnání dat může být nezbytné vložit za data, která netvoří svojí délkou úplný blok, nějaké nevýznamné bajty. Tomu se právě říká data structure padding – „vyplnit to vatou“. Například když je velikost slova 4 bajty (1 bajt je 8 bitů), měla by čtená data o velikosti 4 bajty začínat vždy na násobcích velikosti tohoto slova. Pokud tomu tak není a požadovaná data mají být čtena například od 14. bajtu namísto 16. bajtu, potom by počítač pro přečtení těchto čtyřbajtových dat musel provést operaci čtení nad dvěma slovy, jejich spojování a předání ke zpracování. To je náročnější operace, než kdyby přečetl vše v jednom kroku. Pokud počítač takovou operaci nepodporuje, pak přeruší zpracování a ohlásí . Mnoho počítačových jazyků zajišťuje zarovnání dat automaticky. Některé jazyky, jako jazyk symbolických adres, Ada, některé implementace C a C++ a programovací jazyk D dávají programátorovi částečnou kontrolu nad zarovnáním dat. Popisovaný problém se týká primárně zarovnání v operační paměti. V procesorech s keší se podobné problémy se zarovnáním projevují při čtení bloků z keše. (cs)
- In der Rechnerarchitektur (Computer) bezeichnet man ein Datenelement (oder einen Operanden) mit n Bytes als im Speicher ausgerichtet (englisch Data Alignment, Data Structure Padding), wenn dessen Adresse A ein ganzzahliges Vielfaches von n ist (A mod n = 0). Falls n keine Potenz von 2 ist, muss für die Berechnung n auf die nächsthöhere Potenz von 2 aufgerundet werden. Beispiel: Ein 5-Byte-Datenelement muss entsprechend einem 8-Byte-Datenelement ausgerichtet werden. Ist die Adresse eines Mehrbyte-Datenelements kein derartiges Vielfaches, so ist es nicht ausgerichtet (englisch Data Misalignment). Ein 1-Byte-Datenelement ist jedoch immer ausgerichtet. Typischerweise erfolgt eine byteweise Adressierung des Arbeitsspeichers, und pro Takt kann auf eine Folge von m Bytes zugegriffen werden. Die Anzahl m ist die Breite des Datenbusses in Bytes. Übliche Datenbusbreiten sind 16 Bit (m = 2), 32 Bit (m = 4) und 64 Bit (m = 8). Sind die Operanden im Speicher ausgerichtet, so ist bei n kleiner gleich m nur jeweils ein Speicherzugriff nötig. Auch bei n größer m sind grundsätzlich nur die jeweils minimale Anzahl von Speicherzugriffen nötig. Der Nachteil der Speicherausrichtung besteht darin, dass ggf. der Speicher nicht lückenlos genutzt werden kann. Bei obigem Beispiel des 5-Byte-Datenelements bleiben drei Achtel des Speichers ungenutzt. Sind die Operanden im Speicher nicht ausgerichtet, so ist eine lückenlose Nutzung des Speichers auch bei beliebiger Mischung der Datenformate möglich. Allerdings müssen abhängig von der zufälligen Anordnung ggf. mehr Speicherzugriffe erfolgen, als eigentlich für ein solches Datenelement minimal nötig wären. Durch zusätzliche Shiftoperationen müssen die Operandenteile danach erst wieder zusammengesetzt werden. (Genau genommen sind bei n größer m auch Shift-Operationen nötig, die aber bei vorgegebener Datenbusbreite unvermeidlich und somit kein "data misalignment" sind.) Je nach benutzter Prozessorarchitektur wird ein Zugriff auf nicht ausgerichtete Daten hardwareseitig gar nicht unterstützt. In diesem Falle müsste eine spezielle Programmroutine, welche die Daten softwareseitig zusammensetzt, implementiert und für jeden Zugriff ausgeführt werden. Der Mehraufwand geht damit weit über bloße zusätzliche Speicherzugriffe hinaus. Die Speicherausrichtung wird nur thematisiert, um die Zahl der Speicherzugriffe durch Automatismen bei der Anordnung von Datenelementen zu minimieren. Dass bei n = m + 1 unabhängig von der Speicherausrichtung immer zwei Speicherzugriffe nötig sind, zeigt die Grenzen der eingangs aufgestellten Regeln. Beim schon mehrfach benutzten Beispiel des 5-Byte-Datenelements könnte zunächst bei 4 Byte Datenbusbreite eine korrekte Speicherausrichtung als überflüssig eingestuft werden. Falls jedoch später eine Portierung auf einen doppelt so breiten Datenbus erfolgt, wird die unterlassene Speicherausrichtung zusätzlich Aufwände fordern. Ein weiterer Sonderfall 2n = 3m könnte, wenn er nicht mit dem vorherigen Sonderfall zusammentrifft, eine halbherzige Speicherausrichtung zweckmäßig erscheinen lassen: Eine beispielhafte Folge von mehreren 6-Byte-Datenelementen kann bei 4 Byte Datenbusbreite entweder gut, besser oder schlecht ausgerichtet werden. Gut wäre es, für das erste Datenelement die Regeln zur Speicherausrichtung zu beachten und weitere Datenelemente bündig anzuschließen. Es wären immer jeweils zwei Zugriffe nötig. Besser wäre es, eine mögliche Portierung auf einen doppelt so breiten Datenbus kritisch zu hinterfragen und ggf. gleich eine regelkonforme Speicherausrichtung zu betreiben. In der Praxis war und ist es üblich, die Daten eine Stufe höher als für die Zielmaschine notwendig auszurichten, um wenigstens eine Busbreiten-Verdopplung einzuplanen: Auf 8-Bit-Computern wurden und werden 16-Bit-Werte vorsorglich auf geraden Adressen abgelegt, und bei heutigen 64-Bit-Prozessoren werden 128-Bit-Ausrichtungen empfohlen bzw. von Compilern eingehalten. (de)
- Data structure alignment is the way data is arranged and accessed in computer memory. It consists of three separate but related issues: data alignment, data structure padding, and packing. The CPU in modern computer hardware performs reads and writes to memory most efficiently when the data is naturally aligned, which generally means that the data's memory address is a multiple of the data size. For instance, in a 32-bit architecture, the data may be aligned if the data is stored in four consecutive bytes and the first byte lies on a 4-byte boundary. Data alignment is the aligning of elements according to their natural alignment. To ensure natural alignment, it may be necessary to insert some padding between structure elements or after the last element of a structure. For example, on a 32-bit machine, a data structure containing a 16-bit value followed by a 32-bit value could have 16 bits of padding between the 16-bit value and the 32-bit value to align the 32-bit value on a 32-bit boundary. Alternatively, one can pack the structure, omitting the padding, which may lead to slower access, but uses three quarters as much memory. Although data structure alignment is a fundamental issue for all modern computers, many computer languages and computer language implementations handle data alignment automatically. Fortran, Ada, PL/I, Pascal, certain C and C++ implementations, D, Rust, C#, and assembly language allow at least partial control of data structure padding, which may be useful in certain special circumstances. (en)
- En informatique, les contraintes d'alignement en mémoire limitent à certains multiples d'adresse mémoire, où certaines données et instructions machine peuvent être enregistrées. En outre, les optimisations d'alignement mémoire permettent d'influencer la vitesse d'exécution d'un programme uniquement en choisissant bien les adresses. (fr)
- データ構造アライメント(データこうぞうアライメント、英語: data structure alignment)は、コンピュータのメモリ(主記憶装置)内のデータにアクセス(読み書き)する際に、メモリ上の位置の調整を行うことである。 そこには、別々だが関連する2つの問題、すなわち、データ整列とデータ構造パディングがある。最新のコンピュータがメモリアドレスを読み書きする場合には、ワードサイズのチャンク(32ビットシステムの場合は4バイトのチャンク)単位で実行される。データ整列とは、ワードサイズの倍数に等しいメモリアドレスにデータを配置することであり、CPUがメモリを処理する方法によってシステムのパフォーマンスが向上する。データを整列させるには、最後のデータ構造の終端部分と次のデータ構造の開始部分の間に未使用のバイトを挿入する必要があり、これを「データ構造パディング」という。 例えば、コンピュータのワードサイズが4バイトの場合(バイトは、ほとんどのコンピュータで8ビットを意味するが、一部のシステムでは異なる可能性がある)、読み取るデータは4の倍数のメモリアドレスにある必要がある。例えば、データが16番地ではなく14番地から開始する場合、コンピュータは、4バイトのチャンクを2つ以上読み取り、要求されたデータが読み出される前に何らかの計算を実行しなければならないか、アライメントエラーを生成する可能性がある。よって、その前のデータ構造の終端が13番地にあったとしても、次のデータ構造は16番地から始める必要がある。そのため、2つのパディングバイトが2つのデータ構造の間の14番地と15番地に挿入される。 データ構造のアライメントは現代の全てのコンピュータにとって基本的な問題であるが、多くのコンピュータ言語およびコンピュータ言語の実装がデータ整列を自動的に処理する。Ada、PL/I、C言語(C11以降)・C++(C++11以降)、D言語、Rust、アセンブリ言語は、特定の特殊な状況で有用なデータ構造のパディングを少なくとも部分的に制御することを可能にしている。 (ja)
- Выравнивание данных в оперативной памяти компьютеров — способ размещения данных в памяти особым образом для ускорения доступа. (ru)
- Вирівнювання даних — це метод розміщення даних в оперативній пам'яті особливим чином для прискорення доступу до них. (uk)
- 数据结构对齐是程式编译后資料在記憶體內的佈局与使用方式。包括三方面内容:数据对齐、数据结构填充(padding)与包入(packing)。 现代计算机CPU一般是以32位元或64位元大小作地址对齐,以32位元架構的計算機舉例,每次以連續的4位元組為一個區間,第一個位元組的位址位在每次CPU抓取資料大小的邊界上,除此之外,如果要访问的变量没有对齐,可能会触发总线错误。 当資料小于计算机的字(word)尺寸,可能把几个資料放在一个字中,称为包入(packing)。 许多编程语言自动处理数据结构对齐。Ada语言, PL/I, Pascal, 某些C语言与C++实现, D语言, Rust, 与汇编语言允许特别控制对齐的方式。 (zh)
- En informatique, les contraintes d'alignement en mémoire limitent à certains multiples d'adresse mémoire, où certaines données et instructions machine peuvent être enregistrées. En outre, les optimisations d'alignement mémoire permettent d'influencer la vitesse d'exécution d'un programme uniquement en choisissant bien les adresses. (fr)
- Выравнивание данных в оперативной памяти компьютеров — способ размещения данных в памяти особым образом для ускорения доступа. (ru)
- Вирівнювання даних — це метод розміщення даних в оперативній пам'яті особливим чином для прискорення доступу до них. (uk)
- 数据结构对齐是程式编译后資料在記憶體內的佈局与使用方式。包括三方面内容:数据对齐、数据结构填充(padding)与包入(packing)。 现代计算机CPU一般是以32位元或64位元大小作地址对齐,以32位元架構的計算機舉例,每次以連續的4位元組為一個區間,第一個位元組的位址位在每次CPU抓取資料大小的邊界上,除此之外,如果要访问的变量没有对齐,可能会触发总线错误。 当資料小于计算机的字(word)尺寸,可能把几个資料放在一个字中,称为包入(packing)。 许多编程语言自动处理数据结构对齐。Ada语言, PL/I, Pascal, 某些C语言与C++实现, D语言, Rust, 与汇编语言允许特别控制对齐的方式。 (zh)
- Zarovnání paměti je způsob uspořádání a zpřístupnění dat v paměti počítače. V této souvislosti se používají dva příbuzné pojmy: zarovnání dat a data structure padding. Data structure padding by se do češtiny dalo přeložit jako vkládání vaty (vycpávky či výplně). Když moderní počítače zapisují nebo čtou data z RAM, pracují s blokem dat o konstantní velikosti (například u 32bitových operačních systémů se jedná o blok dat s velikostí 4 bajty). Tento blok dat se označuje pojmem slovo (používá se i anglický výraz word). Zarovnání dat znamená umístit data o velikosti slova v paměti na takovou pozici, která je rovna násobku velikosti slova. To zlepšuje výkon celého systému vzhledem ke způsobu, jakým procesor pracuje s pamětí. Pro správné zarovnání dat může být nezbytné vložit za data, která netvo (cs)
- Data structure alignment is the way data is arranged and accessed in computer memory. It consists of three separate but related issues: data alignment, data structure padding, and packing. The CPU in modern computer hardware performs reads and writes to memory most efficiently when the data is naturally aligned, which generally means that the data's memory address is a multiple of the data size. For instance, in a 32-bit architecture, the data may be aligned if the data is stored in four consecutive bytes and the first byte lies on a 4-byte boundary. (en)
- In der Rechnerarchitektur (Computer) bezeichnet man ein Datenelement (oder einen Operanden) mit n Bytes als im Speicher ausgerichtet (englisch Data Alignment, Data Structure Padding), wenn dessen Adresse A ein ganzzahliges Vielfaches von n ist (A mod n = 0). Falls n keine Potenz von 2 ist, muss für die Berechnung n auf die nächsthöhere Potenz von 2 aufgerundet werden. Beispiel: Ein 5-Byte-Datenelement muss entsprechend einem 8-Byte-Datenelement ausgerichtet werden. (de)
- データ構造アライメント(データこうぞうアライメント、英語: data structure alignment)は、コンピュータのメモリ(主記憶装置)内のデータにアクセス(読み書き)する際に、メモリ上の位置の調整を行うことである。 そこには、別々だが関連する2つの問題、すなわち、データ整列とデータ構造パディングがある。最新のコンピュータがメモリアドレスを読み書きする場合には、ワードサイズのチャンク(32ビットシステムの場合は4バイトのチャンク)単位で実行される。データ整列とは、ワードサイズの倍数に等しいメモリアドレスにデータを配置することであり、CPUがメモリを処理する方法によってシステムのパフォーマンスが向上する。データを整列させるには、最後のデータ構造の終端部分と次のデータ構造の開始部分の間に未使用のバイトを挿入する必要があり、これを「データ構造パディング」という。 データ構造のアライメントは現代の全てのコンピュータにとって基本的な問題であるが、多くのコンピュータ言語およびコンピュータ言語の実装がデータ整列を自動的に処理する。Ada、PL/I、C言語(C11以降)・C++(C++11以降)、D言語、Rust、アセンブリ言語は、特定の特殊な状況で有用なデータ構造のパディングを少なくとも部分的に制御することを可能にしている。 (ja)
- freebase:Data structure alignment
- yago-res:Data structure alignment
- wikidata:Data structure alignment
- dbpedia-bg:Data structure alignment
- dbpedia-cs:Data structure alignment
- dbpedia-de:Data structure alignment
- dbpedia-fa:Data structure alignment
- dbpedia-fr:Data structure alignment
- dbpedia-ja:Data structure alignment
- dbpedia-no:Data structure alignment
- dbpedia-ru:Data structure alignment
- dbpedia-sr:Data structure alignment
- dbpedia-uk:Data structure alignment
- dbpedia-zh:Data structure alignment
- https://global.dbpedia.org/id/RBR3
is dbo:wikiPageRedirects of
- dbr:4-byte_aligned
- dbr:4-byte_alignment
- dbr:4-byte_boundary
- dbr:4096_byte_alignment
- dbr:4096_byte_boundary
- dbr:4096_bytes_alignment
- dbr:4096_bytes_boundary
- dbr:4_byte_alignment
- dbr:4_byte_boundary
- dbr:4_bytes_alignment
- dbr:4_bytes_boundary
- dbr:64-bit_alignment
- dbr:64-bit_boundary
- dbr:64_bit_alignment
- dbr:64_bit_boundary
- dbr:8-bit_alignment
- dbr:8-bit_boundary
- dbr:8-byte_aligned
- dbr:8-byte_alignment
- dbr:8-byte_boundary
- dbr:8_bit_alignment
- dbr:8_bit_boundary
- dbr:8_byte_alignment
- dbr:8_byte_boundary
- dbr:8_bytes_alignment
- dbr:8_bytes_boundary
- dbr:Byte_packing
- dbr:Byte_padding
- dbr:Byte_aligned
- dbr:Byte_alignment
- dbr:Byte_boundary
- dbr:Quad-word_alignment
- dbr:Quadruple_word_alignment
- dbr:1-byte_aligned
- dbr:1-byte_alignment
- dbr:1-byte_boundary
- dbr:16-bit_alignment
- dbr:16-bit_boundary
- dbr:16-byte_aligned
- dbr:16-byte_alignment
- dbr:16-byte_boundary
- dbr:16_bit_alignment
- dbr:16_bit_boundary
- dbr:16_byte_boundary
- dbr:16_bytes_boundary
- dbr:Data_Structure_Alignment
- dbr:2-byte_aligned
- dbr:2-byte_alignment
- dbr:2-byte_boundary
- dbr:Packing_(computing)
- dbr:Double_word_alignment
- dbr:Dword_alignment
- dbr:256-byte_aligned
- dbr:256-byte_alignment
- dbr:256-byte_boundary
- dbr:256_byte_boundary
- dbr:256_bytes_boundary
- dbr:32-bit_alignment
- dbr:32-bit_boundary
- dbr:32_bit_alignment
- dbr:32_bit_boundary
- dbr:Data_alignment
- dbr:Data_padding
- dbr:Paragraph_alignment
- dbr:Paragraph_boundary
- dbr:Inpage_alignment
- dbr:Page_alignment
- dbr:Page_boundary
- dbr:Memory_alignment
- dbr:Qword_alignment
- dbr:Word_alignment_(computing)
- dbr:Word_boundary_(computing)
- dbr:Word_packing
- dbr:Packed
- dbr:Packed_array
- dbr:Doubleword_alignment
- dbr:Alignment_restriction