@@ -166,7 +166,7 @@ public:
166166 }
167167
168168 valarray& operator=(const _Ty& _Val) {
169- const size_t _Size = size();
169+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
170170 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
171171 _Myptr[_Idx] = _Val;
172172 }
@@ -192,7 +192,7 @@ public:
192192 valarray& operator=(const indirect_array<_Ty>& _Indarr); // defined below
193193
194194 _NODISCARD valarray operator+() const {
195- const size_t _Size = size();
195+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
196196 valarray<_Ty> _Ans(_Size);
197197 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
198198 _Ans[_Idx] = +_Myptr[_Idx];
@@ -201,7 +201,7 @@ public:
201201 }
202202
203203 _NODISCARD valarray operator-() const {
204- const size_t _Size = size();
204+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
205205 valarray<_Ty> _Ans(_Size);
206206 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
207207 _Ans[_Idx] = -_Myptr[_Idx];
@@ -210,7 +210,7 @@ public:
210210 }
211211
212212 _NODISCARD valarray operator~() const {
213- const size_t _Size = size();
213+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
214214 valarray<_Ty> _Ans(_Size);
215215 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
216216 _Ans[_Idx] = ~_Myptr[_Idx];
@@ -219,7 +219,7 @@ public:
219219 }
220220
221221 _NODISCARD _Boolarray operator!() const {
222- const size_t _Size = size();
222+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
223223 valarray<bool> _Ans(_Size);
224224 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
225225 _Ans[_Idx] = !_Myptr[_Idx];
@@ -228,159 +228,159 @@ public:
228228 }
229229
230230 valarray& operator*=(const _Ty& _Right) {
231- const size_t _Size = size();
231+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
232232 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
233233 _Myptr[_Idx] *= _Right;
234234 }
235235 return *this;
236236 }
237237
238238 valarray& operator/=(const _Ty& _Right) {
239- const size_t _Size = size();
239+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
240240 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
241241 _Myptr[_Idx] /= _Right;
242242 }
243243 return *this;
244244 }
245245
246246 valarray& operator%=(const _Ty& _Right) {
247- const size_t _Size = size();
247+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
248248 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
249249 _Myptr[_Idx] %= _Right;
250250 }
251251 return *this;
252252 }
253253
254254 valarray& operator+=(const _Ty& _Right) {
255- const size_t _Size = size();
255+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
256256 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
257257 _Myptr[_Idx] += _Right;
258258 }
259259 return *this;
260260 }
261261
262262 valarray& operator-=(const _Ty& _Right) {
263- const size_t _Size = size();
263+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
264264 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
265265 _Myptr[_Idx] -= _Right;
266266 }
267267 return *this;
268268 }
269269
270270 valarray& operator^=(const _Ty& _Right) {
271- const size_t _Size = size();
271+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
272272 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
273273 _Myptr[_Idx] ^= _Right;
274274 }
275275 return *this;
276276 }
277277
278278 valarray& operator&=(const _Ty& _Right) {
279- const size_t _Size = size();
279+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
280280 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
281281 _Myptr[_Idx] &= _Right;
282282 }
283283 return *this;
284284 }
285285
286286 valarray& operator|=(const _Ty& _Right) {
287- const size_t _Size = size();
287+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
288288 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
289289 _Myptr[_Idx] |= _Right;
290290 }
291291 return *this;
292292 }
293293
294294 valarray& operator<<=(const _Ty& _Right) {
295- const size_t _Size = size();
295+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
296296 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
297297 _Myptr[_Idx] <<= _Right;
298298 }
299299 return *this;
300300 }
301301
302302 valarray& operator>>=(const _Ty& _Right) {
303- const size_t _Size = size();
303+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
304304 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
305305 _Myptr[_Idx] >>= _Right;
306306 }
307307 return *this;
308308 }
309309
310310 valarray& operator*=(const valarray& _Right) {
311- const size_t _Size = size();
311+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
312312 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
313313 _Myptr[_Idx] *= _Right[_Idx];
314314 }
315315 return *this;
316316 }
317317
318318 valarray& operator/=(const valarray& _Right) {
319- const size_t _Size = size();
319+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
320320 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
321321 _Myptr[_Idx] /= _Right[_Idx];
322322 }
323323 return *this;
324324 }
325325
326326 valarray& operator%=(const valarray& _Right) {
327- const size_t _Size = size();
327+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
328328 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
329329 _Myptr[_Idx] %= _Right[_Idx];
330330 }
331331 return *this;
332332 }
333333
334334 valarray& operator+=(const valarray& _Right) {
335- const size_t _Size = size();
335+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
336336 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
337337 _Myptr[_Idx] += _Right[_Idx];
338338 }
339339 return *this;
340340 }
341341
342342 valarray& operator-=(const valarray& _Right) {
343- const size_t _Size = size();
343+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
344344 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
345345 _Myptr[_Idx] -= _Right[_Idx];
346346 }
347347 return *this;
348348 }
349349
350350 valarray& operator^=(const valarray& _Right) {
351- const size_t _Size = size();
351+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
352352 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
353353 _Myptr[_Idx] ^= _Right[_Idx];
354354 }
355355 return *this;
356356 }
357357
358358 valarray& operator|=(const valarray& _Right) {
359- const size_t _Size = size();
359+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
360360 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
361361 _Myptr[_Idx] |= _Right[_Idx];
362362 }
363363 return *this;
364364 }
365365
366366 valarray& operator&=(const valarray& _Right) {
367- const size_t _Size = size();
367+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
368368 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
369369 _Myptr[_Idx] &= _Right[_Idx];
370370 }
371371 return *this;
372372 }
373373
374374 valarray& operator<<=(const valarray& _Right) {
375- const size_t _Size = size();
375+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
376376 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
377377 _Myptr[_Idx] <<= _Right[_Idx];
378378 }
379379 return *this;
380380 }
381381
382382 valarray& operator>>=(const valarray& _Right) {
383- const size_t _Size = size();
383+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
384384 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
385385 _Myptr[_Idx] >>= _Right[_Idx];
386386 }
@@ -424,7 +424,7 @@ public:
424424 _NODISCARD indirect_array<_Ty> operator[](const _Sizarray& _Indarr); // defined below
425425
426426 _NODISCARD _Ty sum() const {
427- const size_t _Size = size();
427+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
428428 _Ty _Sum = _Myptr[0];
429429 for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
430430 _Sum += _Myptr[_Idx];
@@ -434,7 +434,7 @@ public:
434434 }
435435
436436 _NODISCARD _Ty(min)() const {
437- const size_t _Size = size();
437+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
438438 _Ty _Min = _Myptr[0];
439439 for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
440440 if (_Myptr[_Idx] < _Min) {
@@ -446,7 +446,7 @@ public:
446446 }
447447
448448 _NODISCARD _Ty(max)() const {
449- const size_t _Size = size();
449+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
450450 _Ty _Max = _Myptr[0];
451451 for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
452452 if (_Max < _Myptr[_Idx]) {
@@ -458,7 +458,7 @@ public:
458458 }
459459
460460 _NODISCARD valarray shift(int _Count) const {
461- const size_t _Size = size();
461+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
462462 valarray<_Ty> _Ans(_Size);
463463 size_t _Min = 0;
464464 size_t _Max = _Size;
@@ -480,7 +480,7 @@ public:
480480 }
481481
482482 _NODISCARD valarray cshift(int _Count) const {
483- const size_t _Size = size();
483+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
484484 if (_Size != 0) {
485485 if (_Count < 0) { // right shift
486486 if (_Size < size_t{0} - _Count) {
@@ -502,7 +502,7 @@ public:
502502 }
503503
504504 _NODISCARD valarray apply(_Ty _Func(_Ty)) const {
505- const size_t _Size = size();
505+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
506506 valarray<_Ty> _Ans(_Size);
507507 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
508508 _Ans[_Idx] = _Func(_Myptr[_Idx]);
@@ -512,7 +512,7 @@ public:
512512
513513 _NODISCARD valarray apply(_Ty _Func(const _Ty&)) const {
514514 // return valarray transformed by _Func, nonmutable argument
515- const size_t _Size = size();
515+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
516516 valarray<_Ty> _Ans(_Size);
517517 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
518518 _Ans[_Idx] = _Func(_Myptr[_Idx]);
@@ -555,10 +555,7 @@ private:
555555
556556 void _Tidy_deallocate() noexcept {
557557 if (_Myptr) { // destroy elements
558- for (size_t _Idx = 0; _Idx < _Mysize; ++_Idx) {
559- _Destroy_in_place(_Myptr[_Idx]);
560- }
561-
558+ _Destroy_range(_Myptr, _Myptr + _Mysize);
562559#ifdef __cpp_aligned_new
563560 constexpr bool _Extended_alignment = alignof(_Ty) > __STDCPP_DEFAULT_NEW_ALIGNMENT__;
564561 if constexpr (_Extended_alignment) {
@@ -574,7 +571,7 @@ private:
574571 }
575572
576573 void _Assign(size_t _Newsize, const _Ty* _Ptr) {
577- const size_t _Size = size();
574+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
578575 if (_Size == _Newsize) {
579576 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
580577 _Myptr[_Idx] = _Ptr[_Idx];
@@ -1988,7 +1985,7 @@ valarray<_Ty>& valarray<_Ty>::operator=(const gslice_array<_Ty>& _Gslicearr) {
19881985 _Tidy_deallocate();
19891986 _Grow(_Gslicearr._Totlen());
19901987 _Sizarray _Indexarray(size_t{0}, _Gslicearr._Nslice());
1991- const size_t _Size = size();
1988+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
19921989 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
19931990 _Myptr[_Idx] = _Gslicearr._Data(_Gslicearr._Off(_Indexarray));
19941991 }
@@ -2011,7 +2008,7 @@ valarray<_Ty>& valarray<_Ty>::operator=(const mask_array<_Ty>& _Maskarr) {
20112008 _Grow(_Maskarr._Totlen());
20122009 size_t _Count = 0;
20132010
2014- const size_t _Size = size();
2011+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
20152012 for (size_t _Idx = 0; _Idx < _Size; ++_Count) {
20162013 if (_Maskarr._Mask(_Count)) {
20172014 _Myptr[_Idx++] = _Maskarr._Data(_Count);
@@ -2035,7 +2032,7 @@ template <class _Ty>
20352032valarray<_Ty>& valarray<_Ty>::operator=(const indirect_array<_Ty>& _Indarr) {
20362033 _Tidy_deallocate();
20372034 _Grow(_Indarr._Totlen());
2038- const size_t _Size = size();
2035+ const size_t _Size = _Mysize; // eliminating indirection helps vectorization
20392036 for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
20402037 _Myptr[_Idx] = _Indarr._Data(_Indarr._Indir(_Idx));
20412038 }
0 commit comments