Я хотел попробовать масштабируемый_аллокатор TBB, но был сбит с толку, когда мне пришлось заменить часть моего кода. Вот как выполняется распределение с помощью распределителя:
SomeClass* s = scalable_allocator<SomeClass>().allocate( sizeof(SomeClass) );
РЕДАКТИРОВАТЬ: то, что показано выше, не соответствует тому, как распределение выполняется с помощью масштабируемого_аллокатора. Как ymett правильно упомянул, распределение делается так:
int numberOfObjectsToAllocateFor = 1;
SomeClass* s = scalable_allocator<SomeClass>().allocate( numberOfObjectsToAllocateFor );
scalable_allocator<SomeClass>().construct( s, SomeClass());
scalable_allocator<SomeClass>().destroy(s);
scalable_allocator<SomeClass>().deallocate(s, numberOfObjectsToAllocateFor);
Это очень похоже на использование malloc:
SomeClass* s = (SomeClass*) malloc (sizeof(SomeClass));
Это код, который я хотел заменить:
SomeClass* SomeClass::Clone() const
{
return new SomeClass(*this);
}//Clone
Итак, попробовал программу:
#include<iostream>
#include<cstdlib>
using namespace std;
class S
{
public:
int i;
S() {cout<<"constructed"<<endl;}
~S() {cout<<"destructed"<<endl;}
S(const S& s):i(s.i) {}
};
int main()
{
S* s = (S*) malloc(sizeof(S));
s = (S*) S();//this is obviously wrong
free(s);
}
и здесь я обнаружил, что вызов malloc не создает экземпляр объекта (ранее я никогда не использовал malloc). Поэтому, прежде чем выяснять, как передать *this копировщику, я хотел бы знать, как создать экземпляр объекта при работе с malloc.
operator newни для интересующего вас класса, ни только для глобального? - person sharptooth   schedule 10.02.2011operator new()намного быстрее и надежнее — вы просто делаете это и перекомпилируете и смотрите, поможет ли это, вам не нужно менять вызывающий код — это сразу везде вступит в силу. - person sharptooth   schedule 10.02.2011