Форум программистов, компьютерный форум 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" не зарегистрирован"; Смотрю отладчиком строка формируется полностью, но выводится все до слова подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.08.2012, 18:12     Статический пул для класса с помошью class::operator new непонятное исключение?
Компилил
вот этот код
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
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
 
#define NDEBUG
 
//Прототипы
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);
    }
};
 
// Пул
const size_t POOL_POSITIONS = 0xFF;
 
unsigned gMemPoolSize = 0;
char*   gMemPool = NULL; // Пул - участок памяти
void*   gMemPoolPointers    [POOL_POSITIONS] = {0}; // Указатели с шагом в размер (Box) по пулу gMemPool
char        gMemPoolStatus  [POOL_POSITIONS] = {0}; // Статус указателей  1 - занят 0 - незанят
 
 
 
// Выделим пямять для пула
void InitMemPool(unsigned int size = 1024) 
{
    gMemPool = (char*) malloc(size);
    gMemPoolSize = size;
#ifdef PRECALC
    // Расстановка указателей адрессации на участки памяти пула.
    for (int i = 0; i < POOL_POSITIONS; i ++) 
    {
        gMemPoolPointers[i] = gMemPool + i * sizeof(Box);
    }
#endif
#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<POOL_POSITIONS; 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
#ifdef PRECALC
            return gMemPoolPointers[i];
#else
            return gMemPool + i * sizeof(Box);
#endif
        } 
    }
}
 
void freeMemPool(void* p ) 
{
    int i = ((char*)p - gMemPool) / sizeof (Box); // вычисляем индекс указателя в пуле
 
    if (i <= POOL_POSITIONS) 
    { 
        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("%d\t", 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("%d\n", iter);
    return 0;
}

Получил такие результаты. Усреднено за десять прогонов (количество итераций за секунду, больше = лучше)
Код
                     Стандарт         Ручное
Вычисление на лету    980 474      9 220 637
Предвычисление        905 384     11 259 098
Итого предвычисление на 18% медленнее, зато экономит омгппц 81 мс времени и аж целый килобайт памяти на формировании индекса.

Ок, понял.
 
Текущее время: 14:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru