2013-02-22 3 views
0

Если у меня есть структура определяется таким образом, как следующее:Компилятор оптимизирует структуры размером 0?

struct blank { 
    int : 0; 
}; 

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

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

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

+0

Какая проверка времени компиляции разрешает C? Кажется, это вопрос только на C++, retagging – Potatoswatter

+1

@Potatoswatter: C __does__ позволяет проверять время компиляции. Например, можно реализовать static assert в C. – 2013-02-22 00:38:40

+3

Профилируйте ли вы и узнаете, что ваша программа тратит большое количество времени на создание экземпляров пустых структур? Если нет, * почему вас это волнует? * –

ответ

5

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

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

Как уже упоминалось, способ C++ 11 - static_assert. Для его использования требуется сообщение об ошибке:

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

Зависит. Если по as-if rule все экземпляры этой структуры могут быть полностью устранены, то компилятор может выполнить эту оптимизацию. Независимо от того, зависит ли ваш компилятор от того, какой компилятор он и, возможно, в настройках оптимизатора.

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

+0

@LokiAstari: да, но если вы никогда не берете адрес, оптимизатор может удалить экземпляр - в конце концов, вы не можете с ним ничего сделать, так что это действительно мертвый код :) –

2

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

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

+0

http://stackoverflow.com/questions/621616/c-what-the-size-of-the-object-of-the-empty-class здесь является оправданием. – Alex