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

Задача с собеседования (аллокатор памяти) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Проверка ввода. Символ 'а' (rus) http://www.cyberforum.ru/cpp-beginners/thread645594.html
В функции main присутствует проверка: for(;;){ cout << "Введите количество дисков (0-выход): "; fflush(stdin); if(scanf("%i", &count) != 1 || cin.rdbuf()->in_avail()!=1 || count < 0) cout << "Неверный ввод\n\n"; else if(count > 64) cout << "Максимальное число дисков: " << max_count << endl << endl;
C++ Ханойские башни Решил задачу о ханойских башнях рекурсивно: void HanBashR(int count, int start, int mid, int final){ if(count == 2){ cout << start << " -> " << mid << endl; cout << start << " -> " << final << endl; cout << mid << " -> " << final << endl; }else if(count > 2){ HanBashR(count - 1, start, final, mid); http://www.cyberforum.ru/cpp-beginners/thread645581.html
C++ Определить номер того элемента массива, который ближе всего к "X"
помогите пожалуйста ещё??? определить порядковый номер того элемента массива, который наиболее близко к некоторому целому числу "X"?
Контейнер и получение динамических объектов C++
Привет. Как можно грамотно с точки зрения ООП реализовать класс-контейнер, где будут хранится объекты? Объекты не однотипные, а наследники. Нужно будет грамотно манипулировать(получать, сортировать итд итп) объектами по наследованному типу. Ваши идеи и примеры. Благодарю
C++ Адрессация в 2-х мерных динамических массивах и nullptr http://www.cyberforum.ru/cpp-beginners/thread645539.html
Сегодня читал стаью о памяти,указателях итп Написал программу для динамического 2х мерного массива // what is array.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream" #include <conio.h> using namespace std;
C++ Приватный конструктор и деструктор Зачем нужны приватный конструктор и деструктор? Как они работают? подробнее

Показать сообщение отдельно
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
02.09.2012, 01:42  [ТС]     Задача с собеседования (аллокатор памяти)
Состряпал вариант... Не слишком убого?
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
#define MAX_SZ 32
#define MAX_ITEM 1000
 
class Alloc2 {
        static char buf[MAX_ITEM * MAX_SZ];
        static bitset<MAX_ITEM> bufmap;
        static int freeblock;
public:
template <typename T>
        static T *allocate(void) {
                int i;
                static_assert( sizeof(T) < MAX_SZ, "Max size for this allocator excessed " );
                for(i=freeblock; i<MAX_ITEM; i++) {
                        if( !bufmap.test(i) )
                                break;
                }
                if( i==MAX_ITEM ) throw new bad_alloc();
                bufmap.set(i, true);
                freeblock=i+1;
                return static_cast<T*> (new (&buf[MAX_SZ*i]) T());
        }
template <typename T>
        static void deallocate(T *ptr) {
                int i = ( ((char*)ptr)-&buf[0] )/MAX_SZ;
                if( !bufmap.test(i) ) throw new logic_error("Wrong deallocate");
                ptr->~T();
                bufmap.set(i, false);
                if( freeblock > i ) freeblock=i;
        }
};
int Alloc2::freeblock=0;
bitset<MAX_ITEM> Alloc2::bufmap = bitset<MAX_ITEM>();
char Alloc2::buf[MAX_ITEM * MAX_SZ];
 
//......
        for(long i=0; i<c; i++) {
                for(int j=0; j<3; j++){
                int *a = Alloc2::allocate<int>();
                *a=5;
                Alloc2::deallocate( a );
                }
        }
Вроде бы по замерам clock() неплохо, но может быть можно лучше?...
Код
new/delete: 921
allocator2: 557
И еще вопрос: как сделать чтобы allocate умел прокидывать параметры конструктора во внутрь Placement new ?
 
Текущее время: 19:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru