cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Attribute [[pack]] для разрешения сжатия путём изменения порядка переменных #248

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +4, -4 Автор идеи: zamazan4ik@tut.by @ZaMaZaN4iK

Добавить в C++ атрибут для разрешения компиляторам переупорядочивания порядка членов структуры\класса для оптимизации размера структуры\класса.

Основная ссылка и обсуждение:

https://groups.google.com/a/isocpp.org/forum/?fromgroups=#!searchin/std-proposals/reorder/std-proposals/sjeBBZduXVc/C5nlKLRKOH0J

Основная идея: ввести атрибут в Стандарт, который будет разрешать переупорядочивать местами переменные в структурах.

Для чего нужно переупорядочивание: снижение размера структуры, рандомизация порядка (пример из ядра Линукс). Если у Вас есть идеи, где это ещё может пригодиться, пишите в комментах. Я пока что фокусируюсь только на снижении размера структуры (что уже есть в Rust)

Крайне рекомендую ознакомиться с изначальным обсуждением в гуглогруппе.

apolukhin commented 3 years ago

Andrey Davydov, 15 декабря 2017, 19:40 Я читал дискуссию по ссылке, возможно, недостаточно внимательно, но не увидел там ответов на следующие вопросы.

  1. Как можно сделать атрибутом то, что компилятор явно проигнорировать не может (как минимум потому что должен поменяться результат вычисления std::is_standard_layout_v)?Кажется, надо действовать по аналогии с alignment specifier.
  2. Почему бы, если уж вводить в стандарт понятие packing'а, то не начать с того, что де факто уже есть во всех компиляторах -- простого packing'а в том смысле как его сейчас понимают GCC, Clang, MSVC -- а не оптимизированного с переупорядочиванием полей? Мотивация для этого -- использовать #pragma pack жутко неудобно, забытый #pragma pack(pop) в header'е ведет к тому что едет layout у всех классов и программа начинает падать в runtime где-нибудь в недрах скомпилированной 3rdparty библиотеки (скажем Qt), отлаживать подобное -- удовольствие ниже среднего.