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

Статический пул для класса с помошью class::operator new непонятное исключение? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как найти дескриптор действительно активного окна? http://www.cyberforum.ru/cpp-beginners/thread637841.html
Я поясню. Запускаю: #include <windows.h> #include <stdio.h> int main () { while (1) { Sleep (1000); printf ("%x\n", GetForegroundWindow ()); }
C++ Построение проекта на CGI (C++) Имеет ли смысл полностью отказаться от PHP (или оставить для инклудов CGI-модулей на страницах, где много текста), и заменить все на С++? Дела с огромным трафиком не имел, максимум 5000 хостов в день, с этим PHP справляется отлично. Но если посмотреть с точки экономии ресурсов и времени выполнения, может стоит прибегнуть к CGI? Тот же Facebook использует HipHop для транслирования PHP в C++ и... http://www.cyberforum.ru/cpp-beginners/thread637834.html
C++ Работа с клавиатурой
Здраствуйте, есть задача эмулировать нажатия клавиш, но winapi не выход, либо там где нада использовать эмуляцию срабатывает защита от эмуляции, хотел узнать как можна решить проблему? Писать драйвер или возможно есть варианты проще? Спасибо.
Цвет текста в консоли C++
Цвет текста в консоли, задний фон текста, общий фон. Как это можно сделать через printf? или же другие функции? Помогите! MVS.
C++ Программное отключение интернета http://www.cyberforum.ru/cpp-beginners/thread637813.html
Всем привет, интересует такой вопрос: Можно кликами мышки выключать интернет в "Центре ...", в настройках адаптера кнопка "Отключить/Включить". Ну так вот, как это сделать из программы? Есть какие-то функции или альтернативы?
C++ Странное поведение wstring Всем привет! Ребята, не могу понять такую ситуацию. Вставляю в wstring строку в позицию 0 таким образом positionclient.insert(0,L"Клиент \" "); positionclient += L" не зарегистрирован"; Смотрю отладчиком строка формируется полностью, но выводится все до слова подробнее

Показать сообщение отдельно
returnless
26 / 26 / 3
Регистрация: 05.08.2012
Сообщений: 83
15.08.2012, 10:00     Статический пул для класса с помошью class::operator new непонятное исключение?
Привет всем! Пытаюсь организовать статический пул(молниеносный аллокатор памяти.
) для некоторого класса. Написал сравнительный тест разница где то до 10 раз, статический пул быстрее.


Но есть одна проблема статический пул у меня по умолчанию имеет размер в 1кб класс весит 12 байт. В цикле они создаются и уничтожаются т.е. пул весь не занимается, однако при малом размере вылетает исключение. не пойму в чем дело, я же занимаю только первые 24 байта пула? Но если увеличеть размер пула void InitMemPool(unsigned int size = 1024*1024) все - ок. вылета нет.

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
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
 
//Прототипы
void* getMemPool    ( unsigned int size ) ;
void freeMemPool(void* p );
 
void InitMemPool    ( unsigned int size ) ;
void TerminateMemPool();
 
enum {memFree, memUsed};
 
// Класс
class Box 
{
    float x;
    float y;
    float z;
public:
    Box(float _x = 0, float _y = 0, float _z = 0) 
    {
        x = _x;
        y = _y;
        z = _z;
    }
    float getVolume() { return x * y * z; }
    void show() { printf("box sizes: %f %f %f volume %f \n", x, y, z, getVolume());}
 
    void *operator new(size_t size) 
    { 
        return getMemPool(size);
    }
    void operator delete(void *p) 
    {
        freeMemPool(p);
    }
};
 
// Пул
unsigned gMemPoolSize = 0;
char*   gMemPool = NULL; // Пул - участок памяти
void*   gMemPoolPointers    [0xFF] = {0}; // Указатели с шагом в размер (Box) по пулу gMemPool
char        gMemPoolStatus  [0xFF] = {0}; // Статус указателей  1 - занят 0 - незанят
 
 
 
// Выделим пямять для пула
void InitMemPool(unsigned int size = 1024) 
{
    gMemPool = (char*) malloc(size);
    gMemPoolSize = size;
    // Расстановка указателей адрессации на участки памяти пула.
    for (int i = 0; i < 0xFF; i ++) 
    {
        gMemPoolPointers[i] = (void*)( (int)(gMemPool) + (int)( i * sizeof(Box)) );
    }
#ifndef NDEBUG
    printf("InitMemPool at %d size %d\n", (int) gMemPool, size);
    printf("Box Size %d\n", sizeof(Box));
    
    for (int i = 0; i < 0x0A; i ++) 
    {
        printf("Pool Index %d at %d size %d\n", i, (int) gMemPoolPointers[i], (int)(i < 1 ? (int)gMemPoolPointers[1] - (int)gMemPoolPointers[0] : (int)gMemPoolPointers[i] - (int)gMemPoolPointers[i-1])  );
    }
 
#endif
}
 
// Освободим память от пула
void TerminateMemPool() 
{
    
    free(gMemPool);
#ifndef NDEBUG
    printf("TerminateMemPool at %d size %d\n", (int) gMemPool, gMemPoolSize);
#endif
    gMemPool = NULL;
    gMemPoolSize = 0;
}
 
void* getMemPool(unsigned int size ) 
{
    
    for (int i = 0; i<0xFF; i++)
    {
        if (gMemPoolStatus[i] == memFree) 
        {
            gMemPoolStatus[i] = memUsed;
#ifndef NDEBUG
            printf("getMemPool size %d pool index %d at %d\n", size, i,  (int)gMemPoolPointers[i]);
#endif
            return gMemPoolPointers[i];
        } 
    }
}
 
void freeMemPool(void* p ) 
{
    int i = (int)( (int*)p - (int*)gMemPoolPointers[0] ); // вычисляем индекс указателя в пуле
    i = (int) (i / sizeof (Box));
 
    gMemPoolStatus[i] = memFree;
#ifndef NDEBUG
    printf("freeMemPool %u at %d\n", i, (int)p);
#endif
}
 
int main() 
{
    // test std new
    int time = GetTickCount()+1000;
    float v = 0.0f;
    unsigned iter = 0;
    while (time > GetTickCount() ) 
    {
        Box* a = ::new Box(1,1,1);
        Box* b = ::new Box(1,1,1);
 
        v += (a->getVolume() + b->getVolume());
        ::delete(a);
        ::delete(b);
 
        iter++;
    }
 
    printf("sum of volumes %f iterations %d \n", v, iter);
 
    // test static pool new
    time = GetTickCount()+1000;
    InitMemPool();
    v = 0.0f;
    iter =0;
    while (time > GetTickCount() ) 
    {
        Box* a = new Box(1,1,1);
        Box* b = new Box(1,1,1);
 
        v += (a->getVolume() + b->getVolume());
 
        delete(a);
        delete(b);
        iter++;
    }
 
    TerminateMemPool();
    printf("sum of volumes %f iterations %d \n", v, iter);
 
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 01:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru