SlideShare a Scribd company logo
1 of 45
О некоторых вопросах
бинарной совместимости в
C++
Гомон Сергей, Regula
Siarhei.Homan@regula.by
Обо мне
Более 5 лет опыта разработки
на C++.
Основные сферы интересов:
● Защита информации
● Сетевая разработка
● Обработка изображений
2
Способы распространения библиотек
• Исходный код
• Статическая библиотека
• Динамическая библиотека
• RPC, COM, протоколы и т. п.
3
Идеальный мир
Один бинарник - все аппаратные и
программные платформы
Реальный мир
Одна аппаратная и программная
платформа - несколько
бинарников
Платформа - совокупность аппаратного и программного обеспечения
(Например Intel x86+Windows, Intel x64+Linux)
4
Исходный код
Плюсы
• Простота и удобство
• Возможность модификации кода
библиотеки
• Возможность поддержать все
платформы
Минусы
• Разные диалекты C++
• Реализация алгоритмов открыта
• Нельзя использовать из других
языков программирования
5
Статическая библиотека
Плюсы
• Реализация алгоритмов скрыта
• Границы модуля четко
определены
Минусы
• Нельзя использовать из других
языков программирования
• Обновление библиотеки требует
перекомпиляции основной
программы
• Большой размер основной
программы
6
Динамическая библиотека
Плюсы
• Малый размер основной
программы
• Эффективное использование
ресурсов системы
• Можно использовать из
других языков
программирования
Минусы
• Требует глубоких знаний
механизмов работы ОС и
компилятора
7
RPC, COM, протоколы и т. п.
Плюсы
• Можно использовать из
других языков
программирования
• Можно использовать через
сеть
Минусы
• Сложно
• Дорого
• Медленно работает
8
Staticlib
(C++ ABI)
Staticlib
(C++ ABI)
Header-
only lib
Dynlib (C ABI)
Web-service
(C# pinvoke,
Java jni, ...)
Internet
Client
Unit-tested
External API tested
App (C#
pinvoke, Java
jni,...)
9
C# assembly COM object
CLI assembly
wrapper (C++
ABI)
C++ App/Lib
Pascal dll (C
ABI)
Client
10
API и ABI
API - application programming interface, интерфейс прикладного
программирования (набор заголовочных файлов, предоставляемых
библиотекой)
11
ABI - application binary interface, бинарный интерфейс приложения
(скомпилированный API, ABI=API+compiler ABI)
Что описывает C++ ABI
• Objects layout
• Calling convention
• Name mangling
• Virtual function mechanism
• Static object instantiation
• C++ support function: set_uexpected(), operator new[]...
• Exception handling
• RTTI
• Template instantiation
• Memory debug facilities
12
ABI языка Си
• Objects alignment
• Name mangling
• Calling convention
• C support functions: atexit()
13
Стандарты Си и C++ не содержит описание ABI
14
Стандарты C++ ABI существуют
• Itanium C++ ABI
• Visual Studio C++ ABI
• Vendor specific C++ ABI (Intel, Embarcadero ...)
15
Пример: один компилятор C++
Продукт: Сложная система с большим количеством модулей
Условия: Для каждой платформы вся система компилируется одним
компилятором C++ с одинаковыми параметрами компиляции
Хотим получить: Возможность обновлять отдельные модули независимо от
других без необходимости перекомпиляции всей системы
16
Бинарная совместимость
Новую версию библиотеки можно использовать в системе без ее
перекомпиляции
Совместимость по исходному коду
Для использования новой библиотеки, систему нужно перекомпилировать,
но без изменений в исходном коде
17
Мы можем...
• Добавить новый класс
• Добавить новый невиртуальный метод или новый конструктор
• Добавить новый enum
• Добавить новый элемент в существующий enum
• Добавить новый статический член
• Удалить приватный невиртуальный метод
• Удалить приватный статический член класа
• ...
18
Мы не можем...
• Добавить новые данные в класс
• Удалить ранее экспортированные функции, методы, классы и т. п.
• Удалить виртуальный метод из класса
• Изменить иерархию классов: добавлять, удалять или менять местами
базовые классы
• Изменить шаблонные параметры: добавлять, удалять, менять местами
• Изменять сигнатуру экспортируемой функции: тип возвращаемого
аргументы, входные аргументы, константность, volatile и т. п.
• ...
19
Нарушение бинарной совместимости (1)
enum Enum {
one,
two,
max = 0xFFFFFFFF
};
sizeof(Enum) is 4
enum Enum {
one,
two,
three,
max = 0xFFFFFFFF
};
sizeof(Enum) is 4
enum Enum {
one,
two,
max = 0xFFFFFFFF,
three
};
sizeof(Enum) is 8
20
Нарушение бинарной совместимости (2)
class A {
public:
A() {}
~A() {}
};
sizeof(A) is 1
class A {
public:
A() {}
~A() {}
void f() {}
};
sizeof(A) is 1
class A {
public:
A() {}
~A() {}
virtual void f() {}
};
sizeof(A) is 4
21
Нарушение бинарной совместимости (3)
class A {
public:
A() {}
~A() {}
};
sizeof(A) is 1
class A {
public:
A() {}
~A() {}
private:
static int _a;
};
sizeof(A) is 1
class A {
public:
A() {}
~A() {}
private:
int _a;
};
sizeof(A) is 4
22
Что может помочь
Зарезервированные поля:
struct S {
int a;
int b;
int c;
int reserverd_1;
int reserverd_2;
};
D-pointer (pimpl)
class A { // Exported
public:
A() { d = new APrivate; }
~A() { delete d; }
private:
class APrivate;
APrivate *d;
};
class APrivate { // Not exported
int a, b, c;
};
23
Пример: несколько компиляторов C++
Продукт: сложная система с большим количеством модулей
Условия: Разные модули могут компилироваться разными компиляторами
Хотим получить: Возможность обновлять отдельные модули независимо от
других без необходимости перекомпиляции всей системы
24
Декорирование имен
QString::replace(int, int, const QChar *, int);
GCC
_ZN7QString7replaceEiiPK5
QChari
Visual Studio
?replace@QString@@QAEA
AV0@HHPBVQChar@@H@
Z
Q126845: "Microsoft does not publish the algorithm its compilers use for name
decoration because it may change in the future."
25
Представление данных (Windows x64)
Microsoft Intel GNU
wchar_t 2 2 4
long int 4 4 8
long double 8 16 16
Разные способы представления знаковых
x = 21 = 0001 0101
-21 = 1110 1011 - two's complement (дополнительный код): 2^N - x
-21 = 1110 1010 - one's complement (обратный код): all bits of x is flipped
26
Выравнивание членов структур по умолчанию
(Windows x86)
Microsoft Intel Borland
2 byte int 2 2 1
4 byte int 4 4 1
8 byte int 8 8 1
float 4 4 1
double 8 8 1
27
Соглашение о вызове
• __cdecl
• __stdcall
• __pascal
• __fastcall
Одинаковые соглашения могут реализовываться
компилятора по-разному!
28
Модель памяти, исключения
• Каждый модуль должен управлять своей памятью
• Исключения не должны выбираться за пределы модуля
29
Макросы определения компилятора
Borland __BORLANDC__
Codeplay VectorC __VECTORC__
Digital Mars __DMC__
Gnu __GNUC__
Intel __INTEL_COMPILER
Microsoft _MSC_VER
Pathscale __PATHSCALE__
Symantec __SYMANTECC__
30
Макросы определения аппаратной платформы
x86 _M_IX86, __INTEL__, __i386__
x86-64 _M_X64, __x86_64__, __amd64
IA64 __IA64__
DEC Alpha __ALPHA__
Motorola Power PC __POWERPC__
Any little endian __LITTLE_ENDIAN__
Any big endian __BIG_ENDIAN__
31
Макросы определения программной платформы
DOS 16 bit __MSDOS__, _MSDOS
Windows 16 bit _WIN16
Windows 32 bit _WIN32, __WINDOWS__
Windows 64 bit _WIN64, _WIN32
Linux 32 bit __unix__, __linux__
Linux 64 bit __unix__, __linux__, __LP64__, __amd64
BSD __unix__, __BSD__, __FREEBSD__
Mac OS __APPLE__, (__DARWIN__, __MACH__)
OS/2 __OS2__
32
COM, XPCOM
COM - component object model, спецификация бинарного
интерфейса от Microsoft.
XPCOM - cross-platform COM, спецификация бинарного
интерфейса от Mozilla для реализации браузера Firefox.
33
Как работает COM
class IUnknown {
virtual HRESULT QueryInterface (REFIID riid, void **ppvObject) = 0;
virtual ULONG AddRef () = 0;
virtual ULONG Release () = 0;
};
34
Экспортирование классов
class Interface {
public:
virtual void destroy() = 0;
virtual void hello() = 0;
virtual void world() = 0;
protected:
virtual ~Interface() {}
};
class Class : public Interface {
public:
static Interface* create() { return new Class; }
void destroy() override { delete this; }
void hello() override { std::cout << "Hello" << std::endl; }
virtual void world() override { std::cout << "World" << std::endl; }
private:
Class() {}
~Class() {}
};
35
CH_DLL_FUNC(Interface*) create() { return Class::create(); }
Использование импортированного класса из C++
36
auto hDynLib = LoadLibraryW(L"DynLib.dll");
auto createFunc =
reinterpret_cast<CreateFunc>(GetProcAddress(hDynLib, "create"));
Interface *obj = createFunc();
obj->hello();
obj->world();
obj->destroy();
obj = nullptr;
Использование импортированного класса из C
37
struct VPtr;
struct CInterface {
VPtr *vptr;
};
typedef void DestroyFunc(CInterface*);
typedef void HelloFunc(CInterface*);
typedef void WorldFunc(CInterface*);
struct VPtr {
DestroyFunc *destroy;
HelloFunc *hello;
WorldFunc *world;
};
HMODULE hDynLib =
LoadLibraryW(L"DynLib.dll");
CreateFunc createFunc =(CreateFunc)(
GetProcAddress(hDynLib, "create"));
CInterface *obj =
(CInterface*)(createFunc());
obj->vptr->hello(obj);
obj->vptr->world(obj);
obj->vptr->destroy(obj);
obj = nullptr;
Пример: несколько языков программирования
Продукт: Сложная система с большим количеством модулей
Условия: Для реализации модулей используются разные языки
программирования
Хотим получить: Возможность обновлять отдельные модули независимо от
других без необходимости перекомпиляции всей системы. Возможность
использовать модули на C++ из других языков программирования.
38
Только Си ABI
• Никакого декорирования имен
• Только POD типы
• Явное указание выравнивания структур
• Явное указание соглашения о вызове
39
Проблемы с Си ABI
Сколько занимает памяти?
struct S {
long l;
int i;
short s;
char ch;
};
15, 16, 24, 32?
Какой символ экспортируется?
int func(int a, int b, int c);
func, _func, _func@12 ?
40
Макросы иногда помогают
41
#ifdef __cplusplus
# define CH_EXTERNC extern "C"
#else // __cplusplus
# define CH_EXTERNC
#endif // __cplusplus
#ifdef _WIN32
# define CH_CDECL __cdecl
# define CH_DLLEXPORT __declspec(dllexport)
# define CH_DLLIMPORT __declspec(dllimport)
# ifdef CH_BUILD_DLL
# define CH_EXPORT CH_EXTERNC CH_DLLEXPORT
# else // CH_BUILD_DLL
# define CH_EXPORT CH_EXTERNC CH_DLLIMPORT
# endif
#else // _WIN32
// ...
#endif // _WIN32
#define CH_DLL_FUNC(type) CH_EXPORT type CH_CDECL
Упаковка стурктур
// DynLibPackPush.h
#ifdef _MSC_VER
#pragma pack(push, 1)
#else // _WIN32
// ...
#endif
// DynLibPackPop.h
#ifdef _MSC_VER
#pragma pack(pop)
#else // _WIN32
// ...
#endif
42
Экспорт функции
43
// DynLib.h
#pragma once
#include <cstdint>
#include "DynLibMacro.h"
#include "DynLibPackPush.h"
typedef uint32_t (*CreateFunc)(uint32_t,uint32_t);
CH_DLL_FUNC(uint32_t) create(uint32_t,uint32_t);
#include "DynLibPackPop.h"
Спасибо за внимание!
44
Источники
1. COM in plain C - http://www.codeproject.com/Articles/13601/COM-in-plain-C
2. Export C++ classes from a DLL - http://www.codeproject.com/Articles/28969/HowTo-Export-C-
classes-from-a-DLL
3. Policies/Binary Compatibility Issues With C++ -
https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B
4. Matthew Wilson - Imperfect C++
5. Agner Fog - Calling conventions for different C++ compilers and operating systems
45

More Related Content

What's hot

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...Nikolay Samokhvalov
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)Ontico
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...Ontico
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...Iosif Itkin
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один goBadoo Development
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаPython Meetup
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждениеYehor Nazarkin
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахAleksander Alekseev
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не оченьcorehard_by
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайOntico
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Ontico
 
6 кареев киров
6 кареев киров6 кареев киров
6 кареев кировqasib
 
Куликовский Дмитрий - Работа системного администратора сегодня
 Куликовский Дмитрий - Работа системного администратора сегодня   Куликовский Дмитрий - Работа системного администратора сегодня
Куликовский Дмитрий - Работа системного администратора сегодня Yandex
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Alexey Lesovsky
 
Система управления автоматическими тестами на примере использования Visual St...
Система управления автоматическими тестами на примере использования Visual St...Система управления автоматическими тестами на примере использования Visual St...
Система управления автоматическими тестами на примере использования Visual St...SQALab
 
Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL Anastasia Lubennikova
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Ontico
 
Беспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQLБеспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQLДмитрий Васильев
 
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS EnvironmentTMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS EnvironmentIosif Itkin
 

What's hot (20)

Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва... Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
Эксперименты с Postgres в Docker и облаках — оптимизация настроек и схемы ва...
 
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
PostgreSQL worst practices / Илья Космодемьянский (Data Egret)
 
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Dat...
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Flask как хорошее решение для веб проекта
Flask как хорошее решение для веб проектаFlask как хорошее решение для веб проекта
Flask как хорошее решение для веб проекта
 
Flask, гордость и предубеждение
Flask, гордость и предубеждениеFlask, гордость и предубеждение
Flask, гордость и предубеждение
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
C++ в играх, больших и не очень
C++ в играх, больших и не оченьC++ в играх, больших и не очень
C++ в играх, больших и не очень
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
6 кареев киров
6 кареев киров6 кареев киров
6 кареев киров
 
Куликовский Дмитрий - Работа системного администратора сегодня
 Куликовский Дмитрий - Работа системного администратора сегодня   Куликовский Дмитрий - Работа системного администратора сегодня
Куликовский Дмитрий - Работа системного администратора сегодня
 
Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.Отладка и устранение проблем в PostgreSQL Streaming Replication.
Отладка и устранение проблем в PostgreSQL Streaming Replication.
 
Система управления автоматическими тестами на примере использования Visual St...
Система управления автоматическими тестами на примере использования Visual St...Система управления автоматическими тестами на примере использования Visual St...
Система управления автоматическими тестами на примере использования Visual St...
 
Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL Советы для начинающих разработчиков PostgreSQL
Советы для начинающих разработчиков PostgreSQL
 
Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)Алексей Рагозин (Deutsche Bank)
Алексей Рагозин (Deutsche Bank)
 
Беспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQLБеспроблемная эксплуатация PostgreSQL
Беспроблемная эксплуатация PostgreSQL
 
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS EnvironmentTMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
 

Viewers also liked

Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines Sergey Zubkov
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projectscorehard_by
 
Unit tests final
Unit tests finalUnit tests final
Unit tests finalcorehard_by
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and catscorehard_by
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtSergey Platonov
 
Теория и практика написания безопасного кода на C++
Теория и практика написания безопасного кода на C++Теория и практика написания безопасного кода на C++
Теория и практика написания безопасного кода на C++corehard_by
 
Хитрости мультипоточности
Хитрости мультипоточностиХитрости мультипоточности
Хитрости мультипоточностиcorehard_by
 
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)corehard_by
 
Разработка и тестирование интернета вещей. Тренды индустрии
Разработка и тестирование интернета вещей. Тренды индустрииРазработка и тестирование интернета вещей. Тренды индустрии
Разработка и тестирование интернета вещей. Тренды индустрииcorehard_by
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Sergey Platonov
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IPlatonov Sergey
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++NextSergey Platonov
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерSergey Platonov
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиvictor-yastrebov
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptSergey Platonov
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 

Viewers also liked (20)

Clang tidy
Clang tidyClang tidy
Clang tidy
 
Parallel STL
Parallel STLParallel STL
Parallel STL
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
C++ Core Guidelines
C++ Core Guidelines C++ Core Guidelines
C++ Core Guidelines
 
Quality assurance of large c++ projects
Quality assurance of large c++ projectsQuality assurance of large c++ projects
Quality assurance of large c++ projects
 
Unit tests final
Unit tests finalUnit tests final
Unit tests final
 
C++ refelection and cats
C++ refelection and catsC++ refelection and cats
C++ refelection and cats
 
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...
 
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на QtДенис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
 
Теория и практика написания безопасного кода на C++
Теория и практика написания безопасного кода на C++Теория и практика написания безопасного кода на C++
Теория и практика написания безопасного кода на C++
 
Хитрости мультипоточности
Хитрости мультипоточностиХитрости мультипоточности
Хитрости мультипоточности
 
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)
упрощаем переход от Json к c++ структурам и обратно (николай гродзицкий)
 
Разработка и тестирование интернета вещей. Тренды индустрии
Разработка и тестирование интернета вещей. Тренды индустрииРазработка и тестирование интернета вещей. Тренды индустрии
Разработка и тестирование интернета вещей. Тренды индустрии
 
Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++Павел Беликов, Как избежать ошибок, используя современный C++
Павел Беликов, Как избежать ошибок, используя современный C++
 
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках IДмитрий Кашицын, Вывод типов в динамических и не очень языках I
Дмитрий Кашицын, Вывод типов в динамических и не очень языках I
 
Антон Бикинеев, Reflection in C++Next
Антон Бикинеев,  Reflection in C++NextАнтон Бикинеев,  Reflection in C++Next
Антон Бикинеев, Reflection in C++Next
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и JavascriptСергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 

Similar to о некоторых вопросах бинарной совместимости в C++

Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Denis Vasilyev
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularizationIvan Krylov
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7Technopark
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
Непрерывная интеграция при разработке баз данных. (Show version)
Непрерывная интеграция при разработке баз данных. (Show version)Непрерывная интеграция при разработке баз данных. (Show version)
Непрерывная интеграция при разработке баз данных. (Show version)Vladimir Bakhov
 
Aleksey Mashanov Rit
Aleksey Mashanov RitAleksey Mashanov Rit
Aleksey Mashanov Ritrit2010
 
Aleksey Mashanov Rit
Aleksey  Mashanov RitAleksey  Mashanov Rit
Aleksey Mashanov Ritrit2010
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.Igor Shkulipa
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Mikhail Kurnosov
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
Drupal -organizaciya_razrabotki
Drupal  -organizaciya_razrabotkiDrupal  -organizaciya_razrabotki
Drupal -organizaciya_razrabotkidrupalconf
 

Similar to о некоторых вопросах бинарной совместимости в C++ (20)

Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++Seminar: Эффективное использование среды разработки и компилятора C++
Seminar: Эффективное использование среды разработки и компилятора C++
 
Java 9: what is there beyond modularization
Java 9: what is there beyond modularizationJava 9: what is there beyond modularization
Java 9: what is there beyond modularization
 
C++ осень 2013 лекция 7
C++ осень 2013 лекция 7C++ осень 2013 лекция 7
C++ осень 2013 лекция 7
 
01 linux-course
01 linux-course01 linux-course
01 linux-course
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
Непрерывная интеграция при разработке баз данных. (Show version)
Непрерывная интеграция при разработке баз данных. (Show version)Непрерывная интеграция при разработке баз данных. (Show version)
Непрерывная интеграция при разработке баз данных. (Show version)
 
Aleksey Mashanov Rit
Aleksey Mashanov RitAleksey Mashanov Rit
Aleksey Mashanov Rit
 
Aleksey Mashanov Rit
Aleksey  Mashanov RitAleksey  Mashanov Rit
Aleksey Mashanov Rit
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
 
C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.C++ STL & Qt. Занятие 11.
C++ STL & Qt. Занятие 11.
 
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)Семинар 1. Многопоточное программирование на OpenMP (часть 1)
Семинар 1. Многопоточное программирование на OpenMP (часть 1)
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
Drupal -organizaciya_razrabotki
Drupal  -organizaciya_razrabotkiDrupal  -organizaciya_razrabotki
Drupal -organizaciya_razrabotki
 

More from corehard_by

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...corehard_by
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...corehard_by
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотниковcorehard_by
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титовcorehard_by
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...corehard_by
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишковcorehard_by
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...corehard_by
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...corehard_by
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...corehard_by
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...corehard_by
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...corehard_by
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филоновcorehard_by
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukićcorehard_by
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakovacorehard_by
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухинcorehard_by
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...corehard_by
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019corehard_by
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019corehard_by
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019corehard_by
 

More from corehard_by (20)

C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
C++ CoreHard Autumn 2018. Создание пакетов для открытых библиотек через conan...
 
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
C++ CoreHard Autumn 2018. Что должен знать каждый C++ программист или Как про...
 
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений ОхотниковC++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
C++ CoreHard Autumn 2018. Actors vs CSP vs Tasks vs ... - Евгений Охотников
 
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр ТитовC++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
C++ CoreHard Autumn 2018. Знай свое "железо": иерархия памяти - Александр Титов
 
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
C++ CoreHard Autumn 2018. Информационная безопасность и разработка ПО - Евген...
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
C++ CoreHard Autumn 2018. Метаклассы: воплощаем мечты в реальность - Сергей С...
 
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
C++ CoreHard Autumn 2018. Что не умеет оптимизировать компилятор - Александр ...
 
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
C++ CoreHard Autumn 2018. Кодогенерация C++ кроссплатформенно. Продолжение - ...
 
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
C++ CoreHard Autumn 2018. Concurrency and Parallelism in C++17 and C++20/23 -...
 
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
C++ CoreHard Autumn 2018. Обработка списков на C++ в функциональном стиле - В...
 
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел ФилоновC++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
C++ Corehard Autumn 2018. Обучаем на Python, применяем на C++ - Павел Филонов
 
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan ČukićC++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
C++ CoreHard Autumn 2018. Asynchronous programming with ranges - Ivan Čukić
 
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia KazakovaC++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
C++ CoreHard Autumn 2018. Debug C++ Without Running - Anastasia Kazakova
 
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон ПолухинC++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
C++ CoreHard Autumn 2018. Полезный constexpr - Антон Полухин
 
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
C++ CoreHard Autumn 2018. Text Formatting For a Future Range-Based Standard L...
 
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
Исключительная модель памяти. Алексей Ткаченко ➠ CoreHard Autumn 2019
 
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019Как помочь и как помешать компилятору. Андрей Олейников ➠  CoreHard Autumn 2019
Как помочь и как помешать компилятору. Андрей Олейников ➠ CoreHard Autumn 2019
 
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019Автоматизируй это. Кирилл Тихонов ➠  CoreHard Autumn 2019
Автоматизируй это. Кирилл Тихонов ➠ CoreHard Autumn 2019
 

о некоторых вопросах бинарной совместимости в C++

  • 1. О некоторых вопросах бинарной совместимости в C++ Гомон Сергей, Regula Siarhei.Homan@regula.by
  • 2. Обо мне Более 5 лет опыта разработки на C++. Основные сферы интересов: ● Защита информации ● Сетевая разработка ● Обработка изображений 2
  • 3. Способы распространения библиотек • Исходный код • Статическая библиотека • Динамическая библиотека • RPC, COM, протоколы и т. п. 3
  • 4. Идеальный мир Один бинарник - все аппаратные и программные платформы Реальный мир Одна аппаратная и программная платформа - несколько бинарников Платформа - совокупность аппаратного и программного обеспечения (Например Intel x86+Windows, Intel x64+Linux) 4
  • 5. Исходный код Плюсы • Простота и удобство • Возможность модификации кода библиотеки • Возможность поддержать все платформы Минусы • Разные диалекты C++ • Реализация алгоритмов открыта • Нельзя использовать из других языков программирования 5
  • 6. Статическая библиотека Плюсы • Реализация алгоритмов скрыта • Границы модуля четко определены Минусы • Нельзя использовать из других языков программирования • Обновление библиотеки требует перекомпиляции основной программы • Большой размер основной программы 6
  • 7. Динамическая библиотека Плюсы • Малый размер основной программы • Эффективное использование ресурсов системы • Можно использовать из других языков программирования Минусы • Требует глубоких знаний механизмов работы ОС и компилятора 7
  • 8. RPC, COM, протоколы и т. п. Плюсы • Можно использовать из других языков программирования • Можно использовать через сеть Минусы • Сложно • Дорого • Медленно работает 8
  • 9. Staticlib (C++ ABI) Staticlib (C++ ABI) Header- only lib Dynlib (C ABI) Web-service (C# pinvoke, Java jni, ...) Internet Client Unit-tested External API tested App (C# pinvoke, Java jni,...) 9
  • 10. C# assembly COM object CLI assembly wrapper (C++ ABI) C++ App/Lib Pascal dll (C ABI) Client 10
  • 11. API и ABI API - application programming interface, интерфейс прикладного программирования (набор заголовочных файлов, предоставляемых библиотекой) 11 ABI - application binary interface, бинарный интерфейс приложения (скомпилированный API, ABI=API+compiler ABI)
  • 12. Что описывает C++ ABI • Objects layout • Calling convention • Name mangling • Virtual function mechanism • Static object instantiation • C++ support function: set_uexpected(), operator new[]... • Exception handling • RTTI • Template instantiation • Memory debug facilities 12
  • 13. ABI языка Си • Objects alignment • Name mangling • Calling convention • C support functions: atexit() 13
  • 14. Стандарты Си и C++ не содержит описание ABI 14
  • 15. Стандарты C++ ABI существуют • Itanium C++ ABI • Visual Studio C++ ABI • Vendor specific C++ ABI (Intel, Embarcadero ...) 15
  • 16. Пример: один компилятор C++ Продукт: Сложная система с большим количеством модулей Условия: Для каждой платформы вся система компилируется одним компилятором C++ с одинаковыми параметрами компиляции Хотим получить: Возможность обновлять отдельные модули независимо от других без необходимости перекомпиляции всей системы 16
  • 17. Бинарная совместимость Новую версию библиотеки можно использовать в системе без ее перекомпиляции Совместимость по исходному коду Для использования новой библиотеки, систему нужно перекомпилировать, но без изменений в исходном коде 17
  • 18. Мы можем... • Добавить новый класс • Добавить новый невиртуальный метод или новый конструктор • Добавить новый enum • Добавить новый элемент в существующий enum • Добавить новый статический член • Удалить приватный невиртуальный метод • Удалить приватный статический член класа • ... 18
  • 19. Мы не можем... • Добавить новые данные в класс • Удалить ранее экспортированные функции, методы, классы и т. п. • Удалить виртуальный метод из класса • Изменить иерархию классов: добавлять, удалять или менять местами базовые классы • Изменить шаблонные параметры: добавлять, удалять, менять местами • Изменять сигнатуру экспортируемой функции: тип возвращаемого аргументы, входные аргументы, константность, volatile и т. п. • ... 19
  • 20. Нарушение бинарной совместимости (1) enum Enum { one, two, max = 0xFFFFFFFF }; sizeof(Enum) is 4 enum Enum { one, two, three, max = 0xFFFFFFFF }; sizeof(Enum) is 4 enum Enum { one, two, max = 0xFFFFFFFF, three }; sizeof(Enum) is 8 20
  • 21. Нарушение бинарной совместимости (2) class A { public: A() {} ~A() {} }; sizeof(A) is 1 class A { public: A() {} ~A() {} void f() {} }; sizeof(A) is 1 class A { public: A() {} ~A() {} virtual void f() {} }; sizeof(A) is 4 21
  • 22. Нарушение бинарной совместимости (3) class A { public: A() {} ~A() {} }; sizeof(A) is 1 class A { public: A() {} ~A() {} private: static int _a; }; sizeof(A) is 1 class A { public: A() {} ~A() {} private: int _a; }; sizeof(A) is 4 22
  • 23. Что может помочь Зарезервированные поля: struct S { int a; int b; int c; int reserverd_1; int reserverd_2; }; D-pointer (pimpl) class A { // Exported public: A() { d = new APrivate; } ~A() { delete d; } private: class APrivate; APrivate *d; }; class APrivate { // Not exported int a, b, c; }; 23
  • 24. Пример: несколько компиляторов C++ Продукт: сложная система с большим количеством модулей Условия: Разные модули могут компилироваться разными компиляторами Хотим получить: Возможность обновлять отдельные модули независимо от других без необходимости перекомпиляции всей системы 24
  • 25. Декорирование имен QString::replace(int, int, const QChar *, int); GCC _ZN7QString7replaceEiiPK5 QChari Visual Studio ?replace@QString@@QAEA AV0@HHPBVQChar@@H@ Z Q126845: "Microsoft does not publish the algorithm its compilers use for name decoration because it may change in the future." 25
  • 26. Представление данных (Windows x64) Microsoft Intel GNU wchar_t 2 2 4 long int 4 4 8 long double 8 16 16 Разные способы представления знаковых x = 21 = 0001 0101 -21 = 1110 1011 - two's complement (дополнительный код): 2^N - x -21 = 1110 1010 - one's complement (обратный код): all bits of x is flipped 26
  • 27. Выравнивание членов структур по умолчанию (Windows x86) Microsoft Intel Borland 2 byte int 2 2 1 4 byte int 4 4 1 8 byte int 8 8 1 float 4 4 1 double 8 8 1 27
  • 28. Соглашение о вызове • __cdecl • __stdcall • __pascal • __fastcall Одинаковые соглашения могут реализовываться компилятора по-разному! 28
  • 29. Модель памяти, исключения • Каждый модуль должен управлять своей памятью • Исключения не должны выбираться за пределы модуля 29
  • 30. Макросы определения компилятора Borland __BORLANDC__ Codeplay VectorC __VECTORC__ Digital Mars __DMC__ Gnu __GNUC__ Intel __INTEL_COMPILER Microsoft _MSC_VER Pathscale __PATHSCALE__ Symantec __SYMANTECC__ 30
  • 31. Макросы определения аппаратной платформы x86 _M_IX86, __INTEL__, __i386__ x86-64 _M_X64, __x86_64__, __amd64 IA64 __IA64__ DEC Alpha __ALPHA__ Motorola Power PC __POWERPC__ Any little endian __LITTLE_ENDIAN__ Any big endian __BIG_ENDIAN__ 31
  • 32. Макросы определения программной платформы DOS 16 bit __MSDOS__, _MSDOS Windows 16 bit _WIN16 Windows 32 bit _WIN32, __WINDOWS__ Windows 64 bit _WIN64, _WIN32 Linux 32 bit __unix__, __linux__ Linux 64 bit __unix__, __linux__, __LP64__, __amd64 BSD __unix__, __BSD__, __FREEBSD__ Mac OS __APPLE__, (__DARWIN__, __MACH__) OS/2 __OS2__ 32
  • 33. COM, XPCOM COM - component object model, спецификация бинарного интерфейса от Microsoft. XPCOM - cross-platform COM, спецификация бинарного интерфейса от Mozilla для реализации браузера Firefox. 33
  • 34. Как работает COM class IUnknown { virtual HRESULT QueryInterface (REFIID riid, void **ppvObject) = 0; virtual ULONG AddRef () = 0; virtual ULONG Release () = 0; }; 34
  • 35. Экспортирование классов class Interface { public: virtual void destroy() = 0; virtual void hello() = 0; virtual void world() = 0; protected: virtual ~Interface() {} }; class Class : public Interface { public: static Interface* create() { return new Class; } void destroy() override { delete this; } void hello() override { std::cout << "Hello" << std::endl; } virtual void world() override { std::cout << "World" << std::endl; } private: Class() {} ~Class() {} }; 35 CH_DLL_FUNC(Interface*) create() { return Class::create(); }
  • 36. Использование импортированного класса из C++ 36 auto hDynLib = LoadLibraryW(L"DynLib.dll"); auto createFunc = reinterpret_cast<CreateFunc>(GetProcAddress(hDynLib, "create")); Interface *obj = createFunc(); obj->hello(); obj->world(); obj->destroy(); obj = nullptr;
  • 37. Использование импортированного класса из C 37 struct VPtr; struct CInterface { VPtr *vptr; }; typedef void DestroyFunc(CInterface*); typedef void HelloFunc(CInterface*); typedef void WorldFunc(CInterface*); struct VPtr { DestroyFunc *destroy; HelloFunc *hello; WorldFunc *world; }; HMODULE hDynLib = LoadLibraryW(L"DynLib.dll"); CreateFunc createFunc =(CreateFunc)( GetProcAddress(hDynLib, "create")); CInterface *obj = (CInterface*)(createFunc()); obj->vptr->hello(obj); obj->vptr->world(obj); obj->vptr->destroy(obj); obj = nullptr;
  • 38. Пример: несколько языков программирования Продукт: Сложная система с большим количеством модулей Условия: Для реализации модулей используются разные языки программирования Хотим получить: Возможность обновлять отдельные модули независимо от других без необходимости перекомпиляции всей системы. Возможность использовать модули на C++ из других языков программирования. 38
  • 39. Только Си ABI • Никакого декорирования имен • Только POD типы • Явное указание выравнивания структур • Явное указание соглашения о вызове 39
  • 40. Проблемы с Си ABI Сколько занимает памяти? struct S { long l; int i; short s; char ch; }; 15, 16, 24, 32? Какой символ экспортируется? int func(int a, int b, int c); func, _func, _func@12 ? 40
  • 41. Макросы иногда помогают 41 #ifdef __cplusplus # define CH_EXTERNC extern "C" #else // __cplusplus # define CH_EXTERNC #endif // __cplusplus #ifdef _WIN32 # define CH_CDECL __cdecl # define CH_DLLEXPORT __declspec(dllexport) # define CH_DLLIMPORT __declspec(dllimport) # ifdef CH_BUILD_DLL # define CH_EXPORT CH_EXTERNC CH_DLLEXPORT # else // CH_BUILD_DLL # define CH_EXPORT CH_EXTERNC CH_DLLIMPORT # endif #else // _WIN32 // ... #endif // _WIN32 #define CH_DLL_FUNC(type) CH_EXPORT type CH_CDECL
  • 42. Упаковка стурктур // DynLibPackPush.h #ifdef _MSC_VER #pragma pack(push, 1) #else // _WIN32 // ... #endif // DynLibPackPop.h #ifdef _MSC_VER #pragma pack(pop) #else // _WIN32 // ... #endif 42
  • 43. Экспорт функции 43 // DynLib.h #pragma once #include <cstdint> #include "DynLibMacro.h" #include "DynLibPackPush.h" typedef uint32_t (*CreateFunc)(uint32_t,uint32_t); CH_DLL_FUNC(uint32_t) create(uint32_t,uint32_t); #include "DynLibPackPop.h"
  • 45. Источники 1. COM in plain C - http://www.codeproject.com/Articles/13601/COM-in-plain-C 2. Export C++ classes from a DLL - http://www.codeproject.com/Articles/28969/HowTo-Export-C- classes-from-a-DLL 3. Policies/Binary Compatibility Issues With C++ - https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C%2B%2B 4. Matthew Wilson - Imperfect C++ 5. Agner Fog - Calling conventions for different C++ compilers and operating systems 45