Форум программистов, компьютерный форум CyberForum.ru

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. В этом файле прописан путь к звуковому воспроизведению в игре. Другими словами заходишь в игру и появляется голос, означающий, что файл dll успешно загружен и готов к работе. Необходимо каким-то... http://www.cyberforum.ru/cpp/thread1396226.html
C++ Ошибка компиляции
Дана задача с использованием friend-ов. Не могу понять почему программа не видит (Square s(5, 4);) Помогите пожалуйста чайнику) #include<iostream> using namespace std; class Square{ private: int width; int lenght; public:
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 secure". И вот сейчас, почти 6 лет спустя, остались ли еще Chromium-based браузеры, поддерживающие NPAPI, но не поддерживающие PPAPI? Интересует только Chromium и Chromium-based. Спросил в этом...
C++ Обход файловой системы и мультипоточность Работаю над программой индексирования файловой системы. Все диски обходяться(как по дереву от корня) до последней папки рекурсивно и собирает данные про все файлы. Принцип работы - создаеться вектор, наполняем его структурами в которые записаны все данные об файлах вытянутые винАпи функциями. Процес работает очень странно, первый запуск программы проходит Файловую систему примерно 2-3... подробнее

Показать сообщение отдельно
hoggy
6369 / 2587 / 452
Регистрация: 15.11.2014
Сообщений: 5,722
Завершенные тесты: 1

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

18.03.2015, 22:03. Просмотров 346. Ответов 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 это проконтролирует.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru