Я ищу хороший (всеобъемлющий) документ о выравнивании памяти в C++, типичных подходах, различиях между компиляторами и распространенных ловушках. Просто чтобы проверить правильность моего понимания темы и узнать что-то новое.
Этот вопрос вдохновлен моим ответом на другой вопрос, где я использовал следующую конструкцию:
char const buf[1000] = ...;
unsigned int i = *reinterpret_cast<unsigned int*>(buf + shift); // shift can be anything
Его критиковали за несоответствие правилам выравнивания памяти. Не могли бы вы объяснить в качестве бонуса, почему этот подход ошибочен с точки зрения выравнивания памяти? Пример, когда это не работает, будет высоко оценен. Я знаю, что в целом это плохой подход, но я часто использую его в реализациях сетевых протоколов, так что это скорее практический вопрос, чем теоретический.
Также, пожалуйста, не упоминайте здесь строгие псевдонимы, это для другого вопроса.
buf
начнется с адреса, кратного 4 - person nos   schedule 06.09.2011shift
может быть что угодно, обновил вопрос - person Andriy Tylychko   schedule 06.09.20111
- оберните ваш int в структуру с выравниванием по 1, и вы действительно можете разыменовать при любом смещении безопасно. Возникающие накладные расходы зависят от архитектуры вашего процессора; на x86 это не должно быть слишком болезненно. - person bdonlan   schedule 06.09.2011