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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
#1

Размещение объектов в заданных блоках памяти - C++

20.04.2013, 23:54. Просмотров 461. Ответов 5
Метки нет (Все метки)

Здорова!
Есть от код:
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
//razmewenie ob6ektov v zadanux blokax pam9ti
#include <iostream>
using std::cout;
using std::endl;
 
class X
{
public:
    X(int){};
    
};
 
class Arena
{
public:
    virtual void* alloc(size_t)=0;
    virtual void free(void*)=0;
};
 
void* operator new(size_t sz, Arena* a)
{
    cout <<"Mu zdec6"<<endl;
    a->alloc(sz);
}
 
 Arena* Persistent;
 Arena* Shared;
 
void g(int i)
{
    X* p= new(Persistent)X(i);//X v arena Persistent
    X* q= new(Shared)X(i);//X v arene Shared
    //...
}
 
void destroy(X*p, Arena* a)
{
    p->~X();//vuzov dectryktora
    a->free(p);//acvobojdenie 
}
 
int main()
{
    
    g(2);
    return 0;
}
В главе говориться что объект X размещается в блоках типа Arena. ну я от сделал как бы рабочий примерчик:
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
//razmewayuchee new
//razmewenie ob6ektov v zadanux blokax pam9ti
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::malloc;
 
//klacc kotorui bydet razmechatc9
class X
{   
int b;
int c;
public:
    void print(){cout <<"eto ob6ekt X"<<endl;}
};
 
//klacc v kotorui bydyt razmechatc9 bazovui
class Arena
{
public:
    virtual void* alloc(size_t)=0;
    virtual void free(void*)=0;
    virtual void print()=0;
};
//nepocredctvenno klacc dl9 razmecheni9
class Arena_1 : public Arena
{
    int i;
public:
    virtual void* alloc(size_t size)
    {
        cout <<"vudelenie pam9ti"<<endl;
        //return malloc(size);//vudelenie novoi pam9ti ne goditc9
        return new(size_t);
    }
    virtual void free(void* p)
    {
        free(p);
    }
    virtual void print()
    {
        cout <<"vuzov Arena_1"<<endl;
    }
};
 
//pomechaem ykazatel6 v lyubom klacce type Arena
void* operator new(size_t sz, Arena* a)
{
    cout <<"Mu zdec6"<<endl;
    
    //a->print();
    a->alloc(sz);
}
 
int main()
{
    //cozdaem ob6ekt type Arena - Arena_1
    Arena_1 obj;//ob6ekt
    //Arena_1 *p=&obj;//ykazatel6 ykazuvaem na ob6ekt
    X* ptr = new(&obj)X;//vuzov operator new c parametrom
    ptr->print();
    cout <<sizeof(ptr)<<endl;//4 byte xot9 X doljen vecit6 8 byte
    cout <<sizeof(X)<<endl;//8byte
    obj.print();
    
    return 0;
}
Я думаю не правильно потому, что у меня новая память вроде выделяется malloc(size) а нужно наверно как то в старую память встроить????????
Не как не могу разобраться как встроить объект. Еще в главе так написано ничо не расписано.

Добавлено через 29 минут
Помоему там нужно в переопределенных функция просто сделать return *this без выделения памяти через malloc() тогда и указатели совпадают и получается, что мы встраиваем и все нормально работает.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2013, 23:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Размещение объектов в заданных блоках памяти (C++):

Размещение в памяти данных - C++
Подскажите отличия,если я читаю данные(вещественные числа) с бинарного файла поэлементно и к примеру если я читаю те же самые данные из...

Размещение объекта в памяти - C++
Возможно ли размещение объекта в заранее выделенной памяти, например в массиве? Тоесть не просто скопировать, а так чтобы создание...

Размещение map'а в памяти - C++
Элементы вектора гарантировано размещаются в памяти рядом, в случае списка элементы лежат где попало, но для этого есть прямые и обратные...

Размещение переменных в памяти - C++
пользуюсь Dev-C++, стало интересно, как компиляторы размещают даныые: последовательно, или как попало? предположим есть объявление int i;...

Размещение элементов в памяти - C++
Добрый день! Подскажите. может ли контейнер STL vector хранить значения типа char (wchar_t)? Если нет, то подскажите, как создать некую...

Размещение функций в памяти - C++
Помогите бедному-зеленому кое-что устаканить в своей голове! Давно тревожит один вопрос: &quot;как расположены функции в памяти?&quot;....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
21.04.2013, 00:22 #2
И Вам доброго времени суток. Я не спец и не сильно вчитывался в код,но судя по вопросу Вам нужна функция realloc,если я все правильно понял
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
21.04.2013, 00:32  [ТС] #3
Цитата Сообщение от metaluga145 Посмотреть сообщение
И Вам доброго времени суток. Я не спец и не сильно вчитывался в код,но судя по вопросу Вам нужна функция realloc,если я все правильно понял
Да нет просто нужно было отак сделать от есть указатель на какой то класс допустим на класс A* указатель p
A* p= new(A);

Как создать указатель допустим на класс С токо чтобы он был в области памяти на которую указывает указатель p?
Ну я так смутно разобрался нужно просто C* pp=new(p)C; отак вызвать. А там для этих классов при перегрузке просто нужно было вернуть *this , короче return *this сделать тогда вроде и адреса совпадают и размер старого класса, а тип нового. Ну типо такая фигня не понятно где она применяется практически, скорее всего никому не нужная.
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
21.04.2013, 00:38 #4
Мне кажется,что легче тогда уже просто переназначить указатель, а потом просто изменить класс внутри так как надо. Это вроде то же самое. Я правильно понял?
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
21.04.2013, 00:47  [ТС] #5
Цитата Сообщение от metaluga145 Посмотреть сообщение
Мне кажется,что легче тогда уже просто переназначить указатель, а потом просто изменить класс внутри так как надо. Это вроде то же самое. Я правильно понял?
Ну ты понял правильно, но это специально сделано чтобы в уже выделеную область памяти в которой уже находиться объект втулить другой объект, я токо не пойму зачем ну фиг сним.
0
Croessmah
Эксперт CЭксперт С++
13228 / 7500 / 845
Регистрация: 27.09.2012
Сообщений: 18,419
Записей в блоге: 3
Завершенные тесты: 1
21.04.2013, 00:54 #6
Placement new
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2013, 00:54
Привет! Вот еще темы с ответами:

Размещение класса в динамической памяти - C++
Добрый день! Интересует такой вопрос, который я никак не пойму: Есть класс class Container, который создается в динамической памяти. c...

размещение файлов в оперативной памяти - C++
Я бы хотел узнать, есть ли способ разместить в оперативной памяти какие нибудь файлы. Например текстовый и какой нибудь исполнительный exe...

Динамическое размещение объекта в определённом месте памяти с последующим её освобождением - C++
Доброго времени суток. В C++ имеется возможность размещать объект по чётко определённому, указанному разработчиком, адресу в памяти. В...

Счётчик заданных объектов - C++
Создать класс,который содержит счётчик созданных объектов класса.Напишите программу-тест,которая проверяет сколько объектов класса создано...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.04.2013, 00:54
Ответ Создать тему
Опции темы

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