Форум программистов, компьютерный форум, киберфорум
Убежденный
Войти
Регистрация
Восстановить пароль
Драйверы, системное программирование и все, что с этим связано.
Рейтинг: 5.00. Голосов: 1.

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

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

Только что с удивлением узнал, что мой любимый компилятор 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/
Размещено в Без категории
Показов 3873 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru