Hardпамять

Чем aligned storage отличается от обычного массива char?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Для «сырой» памяти под объект (placement new) unsigned char buf[sizeof(T)] не гарантирует выравнивание — placement new по misaligned адресу это UB (x86 терпит, ARM/SSE падает). alignas(T) std::byte buf[sizeof(T)] гарантирует правильный alignment.

// ПЛОХО: alignment не гарантирован
unsigned char buf1[sizeof(Widget)];

// ХОРОШО: гарантированный alignment
alignas(Widget) std::byte buf2[sizeof(Widget)];
Widget* w = new (buf2) Widget();  // placement new — безопасно
w->~Widget();                     // ручной вызов деструктора

Применяется в optional, variant, контейнерах для «неинициализированной» памяти под элемент. std::aligned_storage (до C++23) deprecate в пользу alignas. Правило: никогда не выделяйте память под объект без учёта alignof(T).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.