On Nov 26, 5:03 pm, Maxim Yegorushkin <
[email protected]>
wrote:
typedef std::vector<X, aligned_allocator<X, required_alignment> >
VecX;
Max, thanks. I wrote a quick test on your proposal. Unfortunately, got
a compilation error:
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\xutility
(419) : error C2664: 'aligned_allocator<T,alignment>::aligned_allocator
(const aligned_allocator<T,alignment> &) throw()' : cannot convert
parameter 1 from 'aligned_allocator<T,alignment>' to 'const
aligned_allocator<T,alignment> &'
with
[
T=std::_Aux_cont,
alignment=64
]
and
[
T=int,
alignment=64
]
and
[
T=std::_Aux_cont,
alignment=64
]
Reason: cannot convert from 'aligned_allocator<T,alignment>'
to 'const aligned_allocator<T,alignment>'
with
[
T=int,
alignment=64
]
and
[
T=std::_Aux_cont,
alignment=64
]
No user-defined-conversion operator available that can perform
this conversion, or the operator cannot be called
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include
\xutility(417) : while compiling class template member function
'std::_Container_base_aux_alloc_real<_Alloc>::_Container_base_aux_alloc_real
(_Alloc)'
with
[
_Alloc=aligned_allocator<int,64>
]
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include
\vector(421) : see reference to class template instantiation
'std::_Container_base_aux_alloc_real<_Alloc>' being compiled
with
[
_Alloc=aligned_allocator<int,64>
]
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include
\vector(439) : see reference to class template instantiation
'std::_Vector_val<_Ty,_Alloc>' being compiled
with
[
_Ty=int,
_Alloc=aligned_allocator<int,64>
]
.\main.cpp(38) : see reference to class template instantiation
'std::vector<_Ty,_Ax>' being compiled
with
[
_Ty=int,
_Ax=aligned_allocator<int,64>
]
Following is the source of the test:
#include <malloc.h>
#include <memory>
#include <stdexcept>
#include <vector>
template<class T, size_t alignment>
struct aligned_allocator : std::allocator<T>
{
template<class U>
struct rebind { typedef aligned_allocator<U, alignment> other; };
typedef std::allocator<T> base;
typedef typename base:
ointer pointer;
typedef typename base::size_type size_type;
pointer allocate(size_type n)
{
if(pointer p = (pointer)_aligned_malloc(n, alignment))
return p;
throw std::bad_alloc("aligned_allocator");
}
pointer allocate(size_type n, void const*)
{
return this->allocate(n);
}
void deallocate(pointer p, size_type)
{
_aligned_free(p);
}
};
int main(int argc, char* argv[])
{
std::vector<int, aligned_allocator<int, 64> > v(1024);
}