Форум программистов, компьютерный форум, киберфорум
Убежденный
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
Драйверы, системное программирование и все, что с этим связано.

MS C/C++ Compiler и EBCO при множественном наследовании

Запись от Убежденный размещена 24.08.2017 в 16:43
Показов 4720 Комментарии 0

Только что с удивлением узнал, что мой любимый компилятор MS C/C++ Compiler из
Visual Studio не умеет выполнять оптимизацию 'Empty Base Class Optimization' (EBCO)
для ситуаций с множественным наследованием.

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

Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct NoCopyAssign
{
    NoCopyAssign() {}
    ~NoCopyAssign() {}
 
private:
    NoCopyAssign(NoCopyAssign const &);
    NoCopyAssign & operator = (NoCopyAssign const &);
};
 
struct Test :
    private NoCopyAssign // Test нельзя копировать и присваивать.
{
    void * ptr;
};
Теперь при попытке сконструировать Test из существующего объекта или выполнить
присваивание одного Test другому будет выдана ошибка компиляции. Все это давно и
хорошо известно. Но каким будет размер Test? Логика подсказывает, что на "нормальных"
компиляторох это будет sizeof (ptr), т.е. sizeof (void *). Так и есть.

А теперь включим множественное наследование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <cstdio>
 
struct c1 {};
struct c2 {};
struct c3 {};
 
struct Test : c1, c2, c3
{
    void * data;
};
 
int main()
{
    printf("%u, %u\r\n", (unsigned int)sizeof (void *), (unsigned int)sizeof (Test));
    return 0;
}
Увы, MS C/C++ Compiler дает результат "4, 8" для Win32 и "8, 16" для x64.
Проверено на VS2008 SP1 и на VS2015 Update3, конфигурация Release со всеми оптимизациями.

Насколько я знаю, GCC и Clang, а, возможно, и Intel тоже, давно умеют и делают EBCO в
таких ситуациях (проверки на codepad, ideone и rextester это подтверждают).

Единственное, хотя и слабое утешение - в VS2015 Update2 есть малоизвестная опция '__declspec(empty_bases)',
которую со временем хотят сделать поведением по умолчанию. Будем ждать...

Ссылка в тему:

Optimizing the Layout of Empty Base Classes in VS2015 Update 2
https://blogs.msdn.microsoft.c... pdate-2-3/
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
Модель здравосохранения 14. Собираем всю модель вместе.
anaschu 22.05.2026
Модель собрана. В будущих постах на видео я покажу, как она работает. В этом посте запускаем её, проверяем результаты и разбираем что можно с ней делать дальше. Перед запуском проверяем. . .
Модель здравоохранения 13. Добавление самой системы здравоохранения.
anaschu 22.05.2026
В предыдущем посте мы настроили болезни. Теперь добавим события, которые управляют здоровьем всего коллектива, а также настроим рабочий график и расчёт финансов. В Main создаём четыре события. . . .
Модель здравоохранения 12. добавление болезней через ресурпул, как аварии
anaschu 22.05.2026
Болезни — это ключевая часть нашей модели. Нам нужно, чтобы работник периодически уходил на больничный, его задание при этом зависало, а после выздоровления работа возобновлялась. Реализуем это двумя. . .
Модель здравоохранения 11. Создаём классы Задание и Работник
anaschu 22.05.2026
В AnyLogic каждая заявка и каждый ресурс — это объект определённого класса. Нам нужно создать два класса: Задание (заявка) и Работник (ресурс). Класс Задание В дереве проекта нажимаем правой. . .
Модель здравоохранения 10. Новая модель, смотрим, как добавлять логические блоки, и что писать внутри
anaschu 22.05.2026
Открываем AnyLogic, создаём новый проект. В дереве проекта появляется класс Main — это главный агент, в котором будет жить вся наша логика. Палитра блоков Слева находится палитра. Нас интересует. . .
модель ЗдравоСохранения 9. Новая модель, разбираемся, как ее создавать
anaschu 22.05.2026
В этой серии постов мы построим модель небольшого рабочего коллектива. Сотрудники получают задания, выполняют их, иногда болеют — и мы хотим посчитать, сколько это стоит компании. Метод. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru