Является ли это законным в C++ 11? Компилируется с последним компилятором Intel и, похоже, работает, но я просто чувствую, что это случайность.Размещение новое на основе template sizeof()
class cbase
{
virtual void call();
};
template<typename T> class functor : public cbase
{
public:
functor(T* obj, void (T::*pfunc)())
: _obj(obj), _pfunc(pfunc) {}
virtual void call()
{
(_obj)(*_pfunc)();
}
private:
T& _obj;
void (T::*_pfunc)();
//edited: this is no good:
//const static int size = sizeof(_obj) + sizeof(_pfunc);
};
class signal
{
public:
template<typename T> void connect(T& obj, void (T::*pfunc)())
{
_ptr = new (space) functor<T>(obj, pfunc);
}
private:
cbase* _ptr;
class _generic_object {};
typename aligned_storage<sizeof(functor<_generic_object>),
alignment_of<functor<_generic_object>>::value>::type space;
//edited: this is no good:
//void* space[(c1<_generic_object>::size/sizeof(void*))];
};
Конкретно я интересно, если void* space[(c1<_generic_object>::size/sizeof(void*))];
действительно собирается дать правильный размер для объектов-членов c1 в (_obj и _pfunc). (Это не так).
EDIT: Так после еще некоторые исследований, казалось бы, что следующий будет (больше?) Правильно:
typename aligned_storage<sizeof(c1<_generic_object>),
alignment_of<c1<_generic_object>>::value>::type space;
Однако при проверке сгенерированной сборки, используя размещение нового с этим пространством, кажется, тормозит компилятор от оптимизации прочь призыв к «новым» (который, казалось, случилось в то время, используя только регулярные «_ptr = новый c1;»
EDIT2: Изменен код, чтобы сделать намерения немного понятнее
Как это возможно даже для компиляции без предоставления инициализатора для ссылочного элемента в 'c1'? Есть ли какая-то особая важность в этом ссылочном элементе или нет? – AnT
Кроме того, какова идея расчета объема памяти с помощью 'sizeof (_obj)', которая оценивает размер полного объекта (т. Е. 'Sizeof T'), но позже построит объект' c1 'в этом месте, что будет физически содержать только * reference * to 'some_type_t' (реализован как указатель)? –
AnT
Я не знаю, скомпилирован ли он или нет, это очень упрощенный пример, который я сделал для публикации здесь, чтобы вырезать соответствующие разделы. Я пишу класс сигнала/обратного вызова и хочу, если возможно, исключить распределение динамической памяти. –