Jan. 2nd, 2014

ESR (Эрик Реймонд) написал подробное и ясное объяснение того, как в Си выравниваются структуры (alignment). Тем, кто не сталкивался с этим вопросом и не знает, интересно будет почитать.

Почему он при этом назвал свою статью "The Lost Art of C Structure Packing", мне непонятно. ESR почему-то считает, что в наше время все разучились это делать, или просто новые программисты на Си не знают об этом, а помнят одни "старички". Я не вижу оснований так считать. Как мне это помнится - что 20 лет назад, что сейчас: начинающие или малоопытные программисты на Си/С++ не знают про alignment, а опытные знают и по привычке правильно расставляют поля внутри структуры.

Еще есть один простой трюк, который ESR забыл упомянуть: развернуть структуру. Скажем, если у вас есть структура, в которой только указатель и символ, и вы работаете с огромными массивами таких структур, то можно вместо этого держать два отдельных массива, указателей и символов, и работать с ними вместе. Вы платите за этой сложностью кода, и возможно небольшим снижением скорости (за счет локальности кэша CPU), но то, что памяти нужно теперь почти в 2 раза меньше, вполне может перевесить эти недостатки. С другой стороны, конечно, зачастую это будет преждевременная и ненужная оптимизация.

Из дискуссии на Hacker News по поводу этой статьи я хочу процитировать одну мысль про процессоры Intel, которая мне понравилась, и как-то не приходила самому в голову:
Intel actually put in an feature to trap on unaligned access starting with the 486 (and it still exists today) - look up the AC "alignment check" flag. Of course almost no one used that feature since x86 supported unaligned access from the very beginning, and I think this flexibility is one of the reasons why it's stayed competitive: lots of features initially, not all of them optimal (e.g. division instruction on the 8088 was extremely slow), then improve on them with each new microarchitecture, the result being that existing software benefits from these improvements. In contrast, an architecture that didn't support unaligned access would not do much for existing software if faster instructions for unaligned access were introduced since they wouldn't be used.

Иными словами, когда речь идет о наборе возможностей микропроцессора, Интел предпочитал сделать "больше, но плохо", а не "меньше, но хорошо". Медленные инструкции или медленный доступ к невыровненной памяти можно улучшить в следующем процессоре, закон Мура нам поможет, и когда это случится, уже написанные программы сами по себе станут работать быстрее. А если начать с малого, а потом добавлять, то нужно будет еще ждать, пока новые компиляторы и программы напишут, которые используют эти добавки. Выглядит правдоподобно.

March 2014

S M T W T F S
       1
2 3 4 5 6 7 8
9 10 11 12 131415
16171819202122
23242526272829
3031     

Style Credit

Expand Cut Tags

No cut tags
Page generated Oct. 20th, 2017 10:45 am
Powered by Dreamwidth Studios