<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Выравнивание данных (linux, gcc)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html</link>
    <description>Подскажите, есть ли какой-нибудь стандартный способ определить размерность выравнивания данных? Т.е. нужно получить число, которому должен быт кратен размер выровненной структуры данных (может, макрос или хидер).&lt;br&gt;</description>

<item>
    <title>Выравнивание данных (linux, gcc) (f00l)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#10</link>
    <pubDate>Mon, 01 Aug 2011 07:08:03 GMT</pubDate>
    <description>&amp;gt; Подскажите, есть ли какой-нибудь стандартный способ определить размерность выравнивания &lt;br&gt;&amp;gt; данных? Т.е. нужно получить число, которому должен быт кратен размер выровненной &lt;br&gt;&amp;gt; структуры данных (может, макрос или хидер).&lt;br&gt;&lt;br&gt;Для выравнивания структуры обычно используют ключевое слово __attribute__&lt;br&gt;для запаковки структуры с параметром  ((__packed__))&lt;br&gt; пример:&lt;br&gt;  struct my_packed_struct __attribute__ ((__packed__))&lt;br&gt;  &#123;&lt;br&gt;    char c;  &lt;br&gt;    short int i;&lt;br&gt;  &#125;;&lt;br&gt;&lt;br&gt; такая структура занимает 3 байта. &lt;br&gt;&lt;br&gt;больше информации http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Type-Attributes.html&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (AHAHAC)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#9</link>
    <pubDate>Sat, 30 Jul 2011 03:28:09 GMT</pubDate>
    <description>&amp;gt;&amp;gt; union &#123; &lt;br&gt;&amp;gt;&amp;gt;     intmax_t i; &lt;br&gt;&amp;gt;&amp;gt;     long double ld; &lt;br&gt;&amp;gt;&amp;gt;     void *p; &lt;br&gt;&amp;gt;&amp;gt; &#125;; &lt;br&gt;&amp;gt;&amp;gt; Ее sizeof есть максимальная граница выравнивания для ISO C99.&lt;br&gt;&amp;gt; Можно и так, но, думаю, можно обойтись просто sizeof(void*). Главная цель: чтобы &lt;br&gt;&amp;gt; при обращении к данным (структурам и массивам) из некоторой области shared &lt;br&gt;&amp;gt; memory, отображённой в адресное прастранство процесса, процесс обращался к корректным &lt;br&gt;&amp;gt; адресам. &lt;br&gt;&lt;br&gt;Расскажите, что такая за программулина, которой нужно обращение к корректным адресам?!&lt;br&gt;&lt;br&gt;Потом я Вам расскажу, единственное место в современном мире где используется выравнивание.&lt;br&gt;Нет, оно конечно не единственное, есть и более спец. задачи, но те люди которым это нужно&lt;br&gt;на сайте для лохов не пишут.&lt;br&gt;&lt;br&gt;&lt;br&gt;  &lt;br&gt;    &lt;br&gt;</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (Crou)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#8</link>
    <pubDate>Thu, 30 Jun 2011 13:51:08 GMT</pubDate>
    <description>&amp;gt; union &#123; &lt;br&gt;&amp;gt;     intmax_t i; &lt;br&gt;&amp;gt;     long double ld; &lt;br&gt;&amp;gt;     void *p; &lt;br&gt;&amp;gt; &#125;; &lt;br&gt;&amp;gt; Ее sizeof есть максимальная граница выравнивания для ISO C99.&lt;br&gt;&lt;br&gt;Можно и так, но, думаю, можно обойтись просто sizeof(void*). Главная цель: чтобы при обращении к данным (структурам и массивам) из некоторой области shared memory, отображённой в адресное прастранство процесса, процесс обращался к корректным адресам. Т.е. чтобы в отображённом куске shared memory начала структур и массивов имели корректные адреса. Например, на arm&apos;ах (может не на всех, точно не знаю) запрещено обращаться к нечётным адресам, arm генерит исключение при обращении к нечётным адресам. Может linux и умеет разруливать такие ситуации на arm, но не хотелось бы тратить на это процессорное время. Лучше софтину написать с учётом таких особенностей. Думаю, выравнивание данных до размера, кратного sizeof(void*), достаточно и универсально для всех современных архитектур. По крайней мере, для тех трёх, что я указал выше, точно подойдёт.&lt;br&gt;</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (arturpub)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#7</link>
    <pubDate>Thu, 30 Jun 2011 12:33:12 GMT</pubDate>
    <description>&amp;gt;&amp;gt; sizeof() структуры вообще может быть 57, &lt;br&gt;&lt;br&gt;Например struct &#123; char a&#091;56&#093;; char c; &#125;, хотя согласен, пример идиотский.&lt;br&gt;Для struct &#123; short a&#091;28&#093;; char c; &#125; будет уже 58.&lt;br&gt;Для struct &#123; int a&#091;14&#093;; char c; &#125; будет 60, ну теперь-то идея понятна...&lt;br&gt;&lt;br&gt;&amp;gt; В общем, спасибо за совет, буду использовать sizeof(void*).&lt;br&gt;&lt;br&gt;...нужно в структуре визуально найти самый большой по sizeof&apos;у член и выровнять по его границе. Если решение кажется error-prone, например есть структуры в структурах в структурах, можно использовать это:&lt;br&gt;&lt;br&gt;union &#123;&lt;br&gt;    intmax_t i;&lt;br&gt;    long double ld;&lt;br&gt;    void *p;&lt;br&gt;&#125;;&lt;br&gt;&lt;br&gt;Ее sizeof есть максимальная граница выравнивания для ISO C99.&lt;br&gt;</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (Crou)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#6</link>
    <pubDate>Thu, 30 Jun 2011 11:55:02 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt; sizeof(short) == 2, граница 2 &lt;br&gt;&amp;gt; sizeof(int) == 4, граница 4 &lt;br&gt;&amp;gt; sizeof(double) == 8, граница 8 &lt;br&gt;&amp;gt; sizeof(long double) == 10, граница 16, т.к. особо указано в интеловском мануале &lt;br&gt;&amp;gt; sizeof(long long) == 8, граница 4, т.к. для не-FPU/SSE типов граница всегда &lt;br&gt;&amp;gt; &amp;lt;= 4 &lt;br&gt;&amp;gt; Невыровненные обращения ведут к: &lt;br&gt;&amp;gt; а) падению производительности (засчет двух чтений вместо одного, ну или трех вместо &lt;br&gt;&amp;gt; двух) &lt;br&gt;&amp;gt; б) фолту по невыравненному обращению, если включен таковой флаг в MSW/...&lt;br&gt;&lt;br&gt;Это всё понятно.&lt;br&gt;&lt;br&gt;&amp;gt; sizeof() структуры вообще может быть 57, &lt;br&gt;&lt;br&gt;Честно говоря, я не представляю sizeof() структуры == 57, ну разве что &quot;поучить&quot; компилятор с помощью  #pragma pack или align директив. Тогда да, возможно всё. Я это не спора ради, так, мысли вслух.&lt;br&gt;&lt;br&gt;&amp;gt; и выравнивать ее больше, чем на &lt;br&gt;&amp;gt; long double, т.е. 16, не имеет смысла, кроме случаев, когда хочется &lt;br&gt;&amp;gt; попасть на границу кеш-линии, но это другая история, причем непереносимая даже &lt;br&gt;&amp;gt; внутри одной линейки процессоров.&lt;br&gt;&amp;gt; Ты точно ту пр</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (arturpub)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#5</link>
    <pubDate>Wed, 29 Jun 2011 22:27:18 GMT</pubDate>
    <description>&amp;gt; Нашёл в /usr/include/bits/wordsize.h константу __WORDSIZE. Правда оно в битах, но тоже &lt;br&gt;&amp;gt; подходит.&lt;br&gt;&amp;gt; А sizeof(void*) на других платформах (например arm atmega) корректно работает?&lt;br&gt;&lt;br&gt;Корректно.&lt;br&gt;&lt;br&gt;Слушай, граница выравнивания для разных типов данных и/или на разных платформах разная.&lt;br&gt;Например для х86:&lt;br&gt;&lt;br&gt;sizeof(char) == 1, граница 1&lt;br&gt;sizeof(short) == 2, граница 2&lt;br&gt;sizeof(int) == 4, граница 4&lt;br&gt;sizeof(double) == 8, граница 8&lt;br&gt;sizeof(long double) == 10, граница 16, т.к. особо указано в интеловском мануале&lt;br&gt;sizeof(long long) == 8, граница 4, т.к. для не-FPU/SSE типов граница всегда &amp;lt;= 4&lt;br&gt;&lt;br&gt;Невыровненные обращения ведут к:&lt;br&gt;&lt;br&gt;а) падению производительности (засчет двух чтений вместо одного, ну или трех вместо двух)&lt;br&gt;б) фолту по невыравненному обращению, если включен таковой флаг в MSW/...&lt;br&gt;&lt;br&gt;sizeof() структуры вообще может быть 57, и выравнивать ее больше, чем на long double, т.е. 16, не имеет смысла, кроме случаев, когда хочется попасть на границу кеш-линии, но это другая история, причем непереносимая даже вн</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (Crou)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#4</link>
    <pubDate>Wed, 29 Jun 2011 17:59:19 GMT</pubDate>
    <description>Нашёл в /usr/include/bits/wordsize.h константу __WORDSIZE. Правда оно в битах, но тоже подходит.&lt;br&gt;А sizeof(void*) на других платформах (например arm atmega) корректно работает?&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (guest)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#3</link>
    <pubDate>Wed, 29 Jun 2011 05:01:20 GMT</pubDate>
    <description>у gcc есть __alignof__&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Выравнивание данных (linux, gcc) (arturpub)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/9174.html#2</link>
    <pubDate>Tue, 28 Jun 2011 19:00:31 GMT</pubDate>
    <description>&amp;gt; Подскажите, есть ли какой-нибудь стандартный способ определить размерность выравнивания &lt;br&gt;&amp;gt; данных? Т.е. нужно получить число, которому должен быт кратен размер выровненной &lt;br&gt;&amp;gt; структуры данных (может, макрос или хидер).&lt;br&gt;&lt;br&gt;pow(2, ceil(log2(sizeof(x)))) вроде же&lt;br&gt;</description>
</item>

</channel>
</rss>
