Оптимизирует ли компилятор структуры размера 0?

Если у меня есть определенная структура, такая как следующее:

struct blank {
int : 0;
};

Будет ли компилятор оптимизировать это до нуля во время выполнения?

Я спрашиваю из-за это довольно популярный ТАК вопрос. Я хотел бы использовать аналогичные проверки во время компиляции в моем собственном коде C / C ++. Я пытаюсь сделать программу максимально оптимальной, поэтому я не хочу, чтобы эти пустые структуры зависали во время выполнения, если я собираюсь использовать их только для проверки во время компиляции.

Кстати, есть ли C ++ — идиоматический способ достижения того же результата, что и в ссылке?

0

Решение

C ++ допускает такую ​​оптимизацию только тогда, когда объект реализует базовый класс. (Следовательно, это называется оптимизацией пустой базы или EBO.) Для объекта, который стоит один или как член другого struct, он должен быть как минимум на один байт большим, даже если этот байт просто заполнен.

Что касается конструкций, подобных той, что приведена в связанном вопросе, не беспокойтесь. Там нет объекта, только тип. Даже если бы был какой-либо объект, он был бы удален компоновщиком. Функции без ссылок и глобальные объекты не попадают в исполняемый файл, если вы специально не попросите экспортировать все. Даже в этом случае ему, вероятно, все еще нужно иметь имя, которое нужно сохранить.

Как уже упоминалось, C ++ 11 способ сделать это static_assert, Требуется сообщение об ошибке:

static_assert( condition, "Error: condition was false." );
5

Другие решения

Пустая структура гарантированно имеет свой собственный адрес, но это все: вы не потратите время на ее создание (в конце концов, оно пустое; создавать нечего).

C ++ идиоматический способ сделать то же самое использует static_assert (доступно в компиляторах, соответствующих стандарту C ++ 11).

2

Зависит. Если по как будто правило, все экземпляры этой структуры могут быть полностью исключены, тогда компилятор может выполнить эту оптимизацию. То, будет ли ваш компилятор, зависит от того, какой это компилятор и, возможно, от настроек оптимизатора.

На практике, передавая адрес struct Экземпляр за пределами модуля является довольно надежным способом материализации экземпляра в ОЗУ размером не менее одного байта (если только оптимизатор всей программы его не перехватит). Так использует это struct как тип члена в другом struct или же class,

2