Developer notes
Рассмотрим элиминацию (оптимизацию) пустого базового класса на примере двух классов Foo и Bar:
Класс Foo является пустым. Как известно, размер любого объекта пустого класса как — минимум — равен 1 байту (для большинства компиляторов):
sizeof(Foo) == 1
Это достигается молчаливой вставкой компилятором одного байта (char) в такой пустой объект. Теперь посмотрим на размер класса Bar:
sizeof(Bar) == 2 * sizeof(int)
В данном случае объект класса Foo занимает 1 байт с выравниванием до размера члена i sizeof(int). Это связано с тем, что два базовых подобъекта одного типа должны иметь разные адреса.
Теперь организуем класс Bar с помощью наследования следующим образом:
class Bar : public Foo int i;
>;
И снова посмотрим на размер класса Bar:
sizeof(Bar) == sizeof(int)
В итоге мы видим, что компилятор при таком раскладе под подобъект Foo выделил 0 байт. В этом и состоит идея оптимизации пустого базового класса. В стандарте по этому поводу сказано:
A class with an empty sequence of [data] members and base class objects is an empty class. Complete objects and member subobjects of an empty class type shall have nonzero size.
Переменная = empty
Это, конечно, можно, но скорее всего вам это не нужно. В подавляющем большинстве случаев вам известно хорошее, логичное начальное значение для переменной.
29 апр 2017 в 12:01
Связанный вопрос: ru.stackoverflow.com/q/495895/176217
29 апр 2017 в 16:04
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
В дополнение к ответу выше, имеется еще boost::optional и boost::tribool . Простенькая реализация аналога optional пилится самостоятельно очень быстро.
Отслеживать
28.5k 12 12 золотых знаков 58 58 серебряных знаков 118 118 бронзовых знаков
ответ дан 28 апр 2017 в 18:20
Croessmah stands with Russia Croessmah stands with Russia
5,313 13 13 серебряных знаков 21 21 бронзовый знак
В C++ 17 имеется класс std::optional — обертка вокруг других объектов, который позволяет определять, есть ли значение у переменной или нет.
Однако многие компиляторы еще не поддерживают этот класс.
Поэтому для фундаментальных типов нет такого значения, как empty. Вы можете переменные этих типов инициализировать нулем, как это делает компилятор для статических переменных. Тем не менее нельзя сказать, что такие значения являются значением empty.
Вы отправили слишком много запросов, поэтому ваш компьютер был заблокирован.
Для того, чтобы предотвратить автоматическое считывание информации с нашего сервиса, на Linguee допустимо лишь ограниченное количество запросов на каждого пользователя.
Пользователям, браузер которых поддерживает Javascript, доступно большее количество запросов, в отличие от пользователей, чей браузер не поддерживает Javascript. Попробуйте активировать Javascript в настройках вашего браузера, подождать несколько часов и снова воспользоваться нашим сервером.
Если же ваш компьютер является частью сети компьютеров, в которой большое количество пользователей одновременно пользуется Linguee,сообщитеоб этом нам.
Вы отправили слишком много запросов, поэтому ваш компьютер был заблокирован.
Для того, чтобы предотвратить автоматическое считывание информации с нашего сервиса, на Linguee допустимо лишь ограниченное количество запросов на каждого пользователя.
Пользователям, браузер которых поддерживает Javascript, доступно большее количество запросов, в отличие от пользователей, чей браузер не поддерживает Javascript. Попробуйте активировать Javascript в настройках вашего браузера, подождать несколько часов и снова воспользоваться нашим сервером.
Если же ваш компьютер является частью сети компьютеров, в которой большое количество пользователей одновременно пользуется Linguee,сообщитеоб этом нам.