Форум программистов, компьютерный форум, киберфорум
Наши страницы

Union, new placement, strict-aliasing, cross-platform - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Есть ли исходники SpyEye в открытом доступе? http://www.cyberforum.ru/cpp/thread1396628.html
Здравствуйте, форумчане! Можно ли уже спустя 2-3 года найти творение Gribodemon'a с названием SpyEye в открытом доступе? Есть желание покопаться в исходниках, поучиться программировать.
C++ Измените dll Здравствуйте. Не знаю, в тот ли раздел попал или нет, извиняйте))) Требуется помощь. Мои знания в программировании близки к нулю, поэтому решил обратиться к профессионалам.) Итак, есть файл .dll.... http://www.cyberforum.ru/cpp/thread1396226.html
C++ Ошибка компиляции
Дана задача с использованием friend-ов. Не могу понять почему программа не видит (Square s(5, 4);) Помогите пожалуйста чайнику) #include<iostream> using namespace std; class Square{ private:...
C++ Записать текст с переносами в string C++
Здравствуйте! Возникла такая проблема, не могу записать текст из файла в переменную типа string. Через getline() считывается только одна строка, какие существуют альтернативные способы? Что бы потом...
C++ Как считаете, стоит ли еще писать плагины NPAPI (Netscape Plugin API) вместо PPAPI, или уже нет? http://www.cyberforum.ru/cpp/thread1394539.html
On August 12, 2009, a page on Google Code introduced a new project, Pepper, with the associated Pepper Plugin API (PPAPI), "a set of modifications to NPAPI to make plugins more portable and more...
C++ Обход файловой системы и мультипоточность Работаю над программой индексирования файловой системы. Все диски обходяться(как по дереву от корня) до последней папки рекурсивно и собирает данные про все файлы. Принцип работы - создаеться... подробнее

Показать сообщение отдельно
hoggy
6701 / 2883 / 494
Регистрация: 15.11.2014
Сообщений: 6,480
Завершенные тесты: 1

Union, new placement, strict-aliasing, cross-platform - C++

18.03.2015, 22:03. Просмотров 393. Ответов 5
Метки (Все метки)

Доброго времени суток.

Ниже представленный код вроде бы работает.
Гонял его на компиляторах cl/mingw

http://rextester.com/OGKQ63240

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
//Title of this code
//g++  4.8.2
 
#include <iostream>
#include <cassert>
 
#include <type_traits>
 
 
struct IResource
{ 
    virtual void Foo()const =0; 
};
 
struct Resource: IResource
{ 
    virtual void Foo()const { std::cout<<"[ Resource ] hello\n"; }
};
 
 
union Holder
{
private:
    static void dimmy(){}
    typedef void (*unspecified)();
    
    char       mBuf[sizeof(IResource)];
    IResource* mHelper;
    
public:
    
    Holder():mHelper(nullptr){}
    
    IResource& Get()
    { 
        assert( mHelper && "ERROR: Holder is empty" );
        
        //промежуточная переменная служит для предотвращения угрозы
        //dereferencing type-punned pointer will break strict-aliasing rules
        IResource* obj = reinterpret_cast<IResource*>(mBuf);
        return *obj;
    }
    
    
    // true, если пуст
    bool Empty()const 
        { return mHelper? false: true; }
    
    // true, если пуст
    bool operator !()const 
        { return Empty(); }
   
    // true, если ресурс захвачен
    operator unspecified()const 
        { return !Empty()? dimmy: nullptr; }
    
 
    template<class T> void Capture()
    {
        static_assert( std::is_base_of<IResource, T>::value,
            "ERROR: T MUST BE THE HEIR OF THE CLASS 'IHelper'");
        
        static_assert( sizeof(T) == sizeof(IResource),
            "ERROR: SIZE OF T MUST BE == sizeof(IHelper)");
        
        new (mBuf) T;
    }
    
    void Clear() { mHelper = nullptr; }
    
    void View()const
    {
        std::cout << "addr = " << mHelper << mHelper << " : ";
        for(char i: mBuf)
            std::cout<<(int)i<<" ";
        std::cout<<'\n';
    }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    Holder holder;
    holder.View();
    
    std::cout<<"holder is empty ? (must be true) : "
        << !holder<<'\n';
    
    holder.Capture<Resource>();
    holder.View();
    
    std::cout<<"holder is empty ? (must be false) : "
        << !holder<<'\n';
 
    std::cout<<"access to the resource:\n";
    holder.Get().Foo();
    
    std::cout<<"clear...\n";
    holder.Clear();
    
    std::cout<<"holder is empty ? (must be true) : "
        << !holder<<'\n';
    
}
Вопрос следующий: могу ли я закладываться на работоспособность метода
bool Holder::Empty()const ?

Другими словами, может ли теоретически так получится,
что валидный полиморфный объект окажется состоящим из одних нулей?


Кликните здесь для просмотра всего текста
Пожалуйста, не нужно обращать моё внимание на то,
что деструктор захваченного ресурса вызван не будет.
Так специально задумано.

Наследники не имеют права иметь собственных членов.
И static_assert это проконтролирует.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru