Динамиски определить имеет сложный тип или простой
От: LowCoder  
Дата: 13.02.13 07:25
Оценка:
Пишу некое подобие буфера – менеджера памяти – пула памяти (не спрашивайте зачем и не предлагайте плз. буст, стл, и прочее такое- так надо) и вот хотел спросить. Можно ли как то динамически определить имеет ли конструктор или явлется ли объектом класса элемент передаваемый в ранее выделенную при помощи malloc для того что бы вызвать при помощи размещающего оператора new конструкторы передаваемых объектов ну и установить некий флаг что бы потом вручную вызвать деструкторы. Что то вроде (пример из википедии)


class A
{
public:
  A(int x){}
  ~A(){}
};
const int n = 50;
A* placementMemory = static_cast<A*>(operator new[] (n * sizeof(A)));
for (int i = 0; i < n; i++)
{
  new (placementMemory + i) A(rand()); //здесь память для объекта не выделяется, но инициализируется
}
//!!деинициализация памяти
for (int i = 0; i < n; i++)
{
  placementMemory[i].~A();
}
operator delete[] (placementMemory);




для простых типов такие конструкции то не нужны. Вот мне и нужно как то разделить код для объектов и для простых типов. Просто new не подойдет так как мне нужно выделть пул памяти, потом возможно изменять его размер итд. malloc, realloc подходит много лучше, сложности тока с объектами. Если динамичски определить нельзя придется передавть явно как параметр что вот мол объекты сейчас будем размешать а не хотелось бы городить лишних параметров.
Re: Динамиски определить имеет сложный тип или простой
От: uzhas Ниоткуда  
Дата: 13.02.13 08:45
Оценка:
Здравствуйте, LowCoder, Вы писали:

LC>для простых типов такие конструкции то не нужны.

1) для простых типов такие конструкции все равно работают. вопрос лишь в скорости
2) Вот мне и нужно как то разделить код для объектов и для простых типов.
могу порекомендовать type_traits:
is_pod, is_scalar, is_fundamental, etc
http://www.cplusplus.com/reference/type_traits/
специализация контейнеров для POD скорее всего будет работать пошустрее, чем обобщенный вариант

3) Просто new не подойдет так как мне нужно выделть пул памяти, потом возможно изменять его размер итд. malloc, realloc подходит много лучше, сложности тока с объектами.
предупреждаю, что realloc для объектов скорее всего будет работать неправильно, т.к. эта функция работает только с сырой памятью и ничего не знает от типах и конструкторах\деструкторах

успехов
Re: Динамиски определить имеет сложный тип или простой
От: Кодт Россия  
Дата: 13.02.13 08:55
Оценка: +2
Здравствуйте, LowCoder, Вы писали:

LC>Пишу некое подобие буфера – менеджера памяти – пула памяти (не спрашивайте зачем и не предлагайте плз. буст, стл, и прочее такое- так надо) и вот хотел спросить. Можно ли как то динамически определить имеет ли конструктор или явлется ли объектом класса элемент передаваемый в ранее выделенную при помощи malloc для того что бы вызвать при помощи размещающего оператора new конструкторы передаваемых объектов ну и установить некий флаг что бы потом вручную вызвать деструкторы. <>


Просто имея указатель void* на кусок памяти, где размещён объект — ничего нельзя сказать.
Но.
1) можно узнавать статически (на этапе компиляции)
template<class T>
typename std::enable_if< std::is_pod<T>::value, void* >::type
allocate()
{
  // размещаем POD-структуру
}

template<class T>
typename std::enable_if< !std::is_pod<T>::value, void* >::type
allocate()
{
  // размещаем нетривиальный объект
}

2) в блоке выделенной памяти — на основании вышесказанного — можно запомнить информацию, как правильно грохать объект — вот это уже будет рантайм и динамика.
Перекуём баги на фичи!
Re: Динамиски определить имеет сложный тип или простой
От: LowCoder  
Дата: 13.02.13 09:15
Оценка:
Благодарю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.