From 852ab2b5bcb54fd25c607175f7b4f2f46f65673a Mon Sep 17 00:00:00 2001 From: Skidd13 Date: Thu, 28 Jan 2010 09:50:54 +0100 Subject: [PATCH 3/4] -Codechange: Speedup FixedSizeArray by using union --- src/misc/fixedsizearray.hpp | 15 ++++++++------- 1 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/misc/fixedsizearray.hpp b/src/misc/fixedsizearray.hpp index fe7d6b0..16e8847 100644 --- a/src/misc/fixedsizearray.hpp +++ b/src/misc/fixedsizearray.hpp @@ -32,14 +32,15 @@ protected: static const uint Tsize = sizeof(T); // size of item static const uint HeaderSize = sizeof(ArrayHeader); // size of header - /** the only member of fixed size array is pointer to the block - * of C array of items. Header can be found on the offset -sizeof(ArrayHeader). */ - T *data; + union { + T *data; + ArrayHeader *header; + }; /** return reference to the array header (non-const) */ - FORCEINLINE ArrayHeader& Hdr() { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } + FORCEINLINE ArrayHeader& Hdr() { return *(header - 1); } /** return reference to the array header (const) */ - FORCEINLINE const ArrayHeader& Hdr() const { return *(ArrayHeader*)(((byte*)data) - HeaderSize); } + FORCEINLINE const ArrayHeader& Hdr() const { return *(header - 1); } /** return reference to the block reference counter */ FORCEINLINE uint& RefCnt() { return Hdr().reference_count; } /** return reference to number of used items */ @@ -50,7 +51,7 @@ public: FixedSizeArray() { /* allocate block for header + items (don't construct items) */ - data = (T*)((MallocT(HeaderSize + C * Tsize)) + HeaderSize); + header = (ArrayHeader*)MallocT(HeaderSize + C * Tsize) + 1; SizeRef() = 0; // initial number of items RefCnt() = 1; // initial reference counter } @@ -71,7 +72,7 @@ public: Clear(); /* free the memory block occupied by items */ - free(((byte*)data) - HeaderSize); + free((byte*)(header - 1)); data = NULL; } -- 1.6.6