1 // This file is part of Eigen, a lightweight C++ template library
4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
6 // This Source Code Form is subject to the terms of the Mozilla
7 // Public License v. 2.0. If a copy of the MPL was not distributed
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
18 void check_handmade_aligned_malloc()
20 for(int i
= 1; i
< 1000; i
++)
22 char *p
= (char*)internal::handmade_aligned_malloc(i
);
23 VERIFY(size_t(p
)%ALIGNMENT
==0);
24 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
25 for(int j
= 0; j
< i
; j
++) p
[j
]=0;
26 internal::handmade_aligned_free(p
);
30 void check_aligned_malloc()
32 for(int i
= 1; i
< 1000; i
++)
34 char *p
= (char*)internal::aligned_malloc(i
);
35 VERIFY(size_t(p
)%ALIGNMENT
==0);
36 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
37 for(int j
= 0; j
< i
; j
++) p
[j
]=0;
38 internal::aligned_free(p
);
42 void check_aligned_new()
44 for(int i
= 1; i
< 1000; i
++)
46 float *p
= internal::aligned_new
<float>(i
);
47 VERIFY(size_t(p
)%ALIGNMENT
==0);
48 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
49 for(int j
= 0; j
< i
; j
++) p
[j
]=0;
50 internal::aligned_delete(p
,i
);
54 void check_aligned_stack_alloc()
56 for(int i
= 1; i
< 400; i
++)
58 ei_declare_aligned_stack_constructed_variable(float,p
,i
,0);
59 VERIFY(size_t(p
)%ALIGNMENT
==0);
60 // if the buffer is wrongly allocated this will give a bad write --> check with valgrind
61 for(int j
= 0; j
< i
; j
++) p
[j
]=0;
66 // test compilation with both a struct and a class...
69 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
77 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
82 template<typename T
> void check_dynaligned()
85 VERIFY(T::NeedsToAlign
==1);
86 VERIFY(size_t(obj
)%ALIGNMENT
==0);
90 template<typename T
> void check_custom_new_delete()
98 std::size_t N
= internal::random
<std::size_t>(1,10);
105 T
* t
= static_cast<T
*>((T::operator new)(sizeof(T
)));
106 (T::operator delete)(t
, sizeof(T
));
110 T
* t
= static_cast<T
*>((T::operator new)(sizeof(T
)));
111 (T::operator delete)(t
);
118 // low level dynamic memory allocation
119 CALL_SUBTEST(check_handmade_aligned_malloc());
120 CALL_SUBTEST(check_aligned_malloc());
121 CALL_SUBTEST(check_aligned_new());
122 CALL_SUBTEST(check_aligned_stack_alloc());
124 // check static allocation, who knows ?
125 #if EIGEN_ALIGN_STATICALLY
126 for (int i
=0; i
<g_repeat
*100; ++i
)
128 CALL_SUBTEST(check_dynaligned
<Vector4f
>() );
129 CALL_SUBTEST(check_dynaligned
<Vector2d
>() );
130 CALL_SUBTEST(check_dynaligned
<Matrix4f
>() );
131 CALL_SUBTEST(check_dynaligned
<Vector4d
>() );
132 CALL_SUBTEST(check_dynaligned
<Vector4i
>() );
134 CALL_SUBTEST( check_custom_new_delete
<Vector4f
>() );
135 CALL_SUBTEST( check_custom_new_delete
<Vector2f
>() );
136 CALL_SUBTEST( check_custom_new_delete
<Matrix4f
>() );
137 CALL_SUBTEST( check_custom_new_delete
<MatrixXi
>() );
141 MyStruct foo0
; VERIFY(size_t(foo0
.avec
.data())%ALIGNMENT
==0);
142 MyClassA fooA
; VERIFY(size_t(fooA
.avec
.data())%ALIGNMENT
==0);
145 // dynamic allocation, single object
146 for (int i
=0; i
<g_repeat
*100; ++i
)
148 MyStruct
*foo0
= new MyStruct(); VERIFY(size_t(foo0
->avec
.data())%ALIGNMENT
==0);
149 MyClassA
*fooA
= new MyClassA(); VERIFY(size_t(fooA
->avec
.data())%ALIGNMENT
==0);
154 // dynamic allocation, array
156 for (int i
=0; i
<g_repeat
*100; ++i
)
158 MyStruct
*foo0
= new MyStruct
[N
]; VERIFY(size_t(foo0
->avec
.data())%ALIGNMENT
==0);
159 MyClassA
*fooA
= new MyClassA
[N
]; VERIFY(size_t(fooA
->avec
.data())%ALIGNMENT
==0);