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 подскажет развёрнутый ответ в реальном времени.