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

Чем _Get_pointer_type отличается от обычного получения типа указателя - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Необходимо протестировать костыль. Конвертирование Glib::ustring в sf::String http://www.cyberforum.ru/cpp/thread1565314.html
Есть строка Glib::ustring, пытался её конвертировать в sf::String, и вроде бы всё работает без особых костылей, но как добрался до кириллицы, нифига ничего не работает. Придумал такой костыль: sf::String convert_from_ustring (const Glib::ustring& source_string) { static std::wstringstream ss ; ss.clear() ; ss << source_string ; return sf::String(ss.str()) ; }
C++ Динамическая списочная структура, содержащая объекты классов, связанных наследованием В общем. Есть базовый класс и 2 класса наследника. Нужно создать динамическую структуру(пусть это будет односвязный список) в который можно добавлять или удалять объекты любого из 3-х классов. Я сделал односвязный список в который можно добавлять базовый класс. Но вот как реализовать возможность хранения в одном списке различных классов? #include <stdio.h> #include <iostream> #include... http://www.cyberforum.ru/cpp/thread1564885.html
C++ Протестируйте функцию сортировки контейнера
У set контейнера странная сортировка, решил написать функцию которая увеличивала на одну единицу значение вектора. Вектор выступает как "виртуальное целое число". Так как стандартный обход char от 0 до -128 и увеличить переменную со значением -128 приведет что переменная будет равна 0. А сортировка у set контейнера от -128 до 127. Вопрос правильно ли работает моя функция. Я просто не знаю как...
C++ Поиск фигуры на картинке
Суть задания: В окне программы рисуется фигура (треугольник или прямоугольник). При нажатии на кнопку "Go", в верхнем левом углу окна программы появляется объект (допустим в виде квдратика) у которого есть направление сканирования (хз как это еще описать). Он должен: 1. Найти фигуру (которую мы нарисовали в начале). 2. Приблизится впритык к фигуре. 3. Полностью обойти фигуру. 4. Выдать...
C++ Ссылка для скачивания visual studio 2010 professional http://www.cyberforum.ru/cpp/thread1562518.html
В интернете постоянно, когда скачиваю visual studio 2010 professional rus выходит при установке образ жесткого диска, но так никогда не было когда скачивала раньше. Старая установка исчезла из-за переустановки винды. Может кто-нибудь поможет мне, скинет ссылку для скачивания нормальной visual studio 2010 professional rus x64bit. мне именно нужна 2010..а не новые 2013, 2015г
C++ Парсинг файлов .dem Приветствую, ребята, в инете что-то не могу найти инфу по этому вопросу, в частности нужна структура файла .dem (это демо контры, халвы и т.п. подобных проектов h2l) Если кто знаком - киньте ссылки пожалуйста :) подробнее

Показать сообщение отдельно
Archi0
28 / 14 / 4
Регистрация: 18.07.2013
Сообщений: 167
01.11.2015, 03:49  [ТС]     Чем _Get_pointer_type отличается от обычного получения типа указателя
Очевидно, если знаешь как писать Alloc, только в книгах обычно рассказывается про стандартные контейнеры и алгоритмы с ними, а про Alloc ни слова, кроме того, что есть такой параметр. Вот и пришлось лезть в код и смотреть для чего это.

Вот попробовал реализовать линейную модель памяти

Кликните здесь для просмотра всего текста

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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <vector>
#include <stack>
#include <deque>
 
struct Probationer
{
    int x;
    int y;
    Probationer(int one, int two)
    {
        x = one;
        y = two;
    }
};
 
class LinearMemoryManager
{
    //_CRT_PACKING
private:
    void* buffer;
    void* current;
    size_t size;
    
public:
    
    template<class _Ty>
    struct _Allocator_base
    {   // base class for generic allocators
        typedef _Ty value_type;
    };
 
    LinearMemoryManager(size_t sizeBuff)
    {
        buffer = 0;
        buffer = new char[sizeBuff];
        if (buffer != 0) { size = sizeBuff; current = buffer; }
        else { size = 0; current = 0; }
    }
 
    ~LinearMemoryManager()
    {
        delete[] buffer;
    }
 
    ptrdiff_t Usage()
    {
        return (char*)current - (char*)buffer;
    }
 
    template<class _Ty> class LinearAlloc : public _Allocator_base < _Ty >
    {
    public:
        typedef LinearAlloc<_Ty> other;
        typedef _Allocator_base<_Ty> _Mybase;
        typedef typename _Mybase::value_type value_type;
        typedef value_type *pointer;
        typedef const value_type *const_pointer;
        typedef void *void_pointer;
        typedef const void *const_void_pointer;
        typedef value_type& reference;
        typedef const value_type& const_reference;
        typedef size_t size_type;
        typedef ptrdiff_t difference_type;
 
        LinearMemoryManager& lmm = RetCurrentMemoryManager();
        LinearAlloc() _THROW0()
        {   // construct default allocator (do nothing)
        }
 
        LinearAlloc<_Ty> select_on_container_copy_construction() const
        {   // return this allocator
            return (*this);
        }
 
        template<class _Other>
        struct rebind
        {   // convert this type to allocator<_Other>
            typedef LinearAlloc<_Other> other;
        };
 
        pointer address(reference _Val) const _NOEXCEPT
        {   // return address of mutable _Val
            return (_STD addressof(_Val));
        }
 
            const_pointer address(const_reference _Val) const _NOEXCEPT
        {   // return address of nonmutable _Val
            return (_STD addressof(_Val));
        }
 
            template<class _Other>
        LinearAlloc(const LinearAlloc<_Other>&) _THROW0()
        {   // construct from a related allocator (do nothing)
        }
 
        template<class _Other>
        LinearAlloc<_Ty>& operator=(const LinearAlloc<_Other>&)
        {   // assign from a related allocator (do nothing)
            return (*this);
        }
 
        void deallocate(pointer _Ptr, size_type)
        {   // deallocate object at _Ptr, ignore size
            if ( ((char*)lmm.current) - ((char*)_Ptr) - sizeof(_Ptr) < _CRT_PACKING) lmm.current = (void*)_Ptr;
            destroy(_Ptr);
        }
 
        pointer allocate(size_type _Count)
        {   // allocate array of _Count elements
            void *_Ptr = 0;
                if (_Count == 0);
                else if ((lmm.size - ((char*)lmm.current - (char*)lmm.buffer)) / sizeof(value_type) >= _Count)
                {
                    _Ptr = lmm.current;
                    if ((sizeof(value_type)*_Count) % _CRT_PACKING == 0) lmm.current = (void*)((pointer)lmm.current + _Count);
                    else { lmm.current = (void*)((pointer)lmm.current + _Count); lmm.current = (char*)lmm.current + _CRT_PACKING - (sizeof(value_type)*_Count) % _CRT_PACKING; }
                }
            return ((_Ty *)_Ptr);
        }
 
        pointer allocate(size_type _Count, const void *)
        {   // allocate array of _Count elements, ignore hint
            return (allocate(_Count));
        }
        void construct(_Ty *_Ptr)
        {   // default construct object at _Ptr
            ::new ((void *)_Ptr) _Ty();
        }
 
        void construct(_Ty *_Ptr, const _Ty& _Val)
        {   // construct object at _Ptr with value _Val
            ::new ((void *)_Ptr) _Ty(_Val);
        }
 
        template<class _Objty,
        class... _Types>
            void construct(_Objty *_Ptr, _Types&&... _Args)
        {   // construct _Objty(_Types...) at _Ptr
            ::new ((void *)_Ptr) _Objty(_STD forward<_Types>(_Args)...);
        }
 
        template<class _Uty>
        void destroy(_Uty *_Ptr)
        {   // destroy object at _Ptr
            _Ptr->~_Uty();
        }
 
        size_t max_size() const _THROW0()
        {   // estimate maximum array size
            return (lmm.size / sizeof(value_type));
        }
    };
    template <class _Ty>
    _Ty* allocate(size_t _Count)
    {
        LinearAlloc<_Ty> Alloc0;
        return Alloc0.allocate(_Count);
    }
 
    template <class _Ty>
    void construct(_Ty *_Ptr, const _Ty& _Val)
    {   // construct object at _Ptr with value _Val
        ::new ((void *)_Ptr) _Ty(_Val);
    }
 
    template<class _Objty, class... _Types>
    void construct(_Objty *_Ptr, _Types&&... _Args)
    {   // construct _Objty(_Types...) at _Ptr
        ::new ((void *)_Ptr) _Objty(_STD forward<_Types>(_Args)...);
    }
 
};
 
LinearMemoryManager lmm = LinearMemoryManager(1000);
LinearMemoryManager& RetCurrentMemoryManager()
{
    return lmm;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x;
    std::vector<int, LinearMemoryManager::LinearAlloc<int> > fg;
    fg.push_back(1);
    fg.push_back(2);
    fg.push_back(3);
    fg.push_back(4);
    std::cout << std::endl << lmm.Usage() << std::endl;
    std::stack<int, std::deque<int, LinearMemoryManager::LinearAlloc<int> > > fg2;
    int j = 100;
    while (j > 0)   { fg2.push(1); j--; }
    Probationer *pptr = lmm.allocate<Probationer>(1);
    lmm.construct(pptr, Probationer(1, 2));
    lmm.construct(pptr, 1, 2);
    std::cout << pptr->x << " " << pptr->y;
    std::cout << std::endl << lmm.Usage() << std::endl;
    std::cout << lmm.Usage() << std::endl;
    std::cin >> x;
    return 0;
}


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