From e736e0c2d52a29a3b88a29ab39b3a90a5a2443a0 Mon Sep 17 00:00:00 2001 From: herb Date: Thu, 3 Nov 2016 07:34:15 -0700 Subject: Try to use only std::aligned_storage. This does not change the API. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2468243002 TBR=reed@google.com Review-Url: https://codereview.chromium.org/2468243002 --- include/core/SkPostConfig.h | 9 --------- src/core/SkLinearBitmapPipeline.h | 17 +++++++---------- src/core/SkSmallAllocator.h | 12 +++++------- 3 files changed, 12 insertions(+), 26 deletions(-) diff --git a/include/core/SkPostConfig.h b/include/core/SkPostConfig.h index 1b1cb3e751..c34397cde6 100644 --- a/include/core/SkPostConfig.h +++ b/include/core/SkPostConfig.h @@ -77,15 +77,6 @@ # endif #endif -// As usual, there are two ways to increase alignment... the MSVC way and the everyone-else way. -#ifndef SK_STRUCT_ALIGN - #ifdef _MSC_VER - #define SK_STRUCT_ALIGN(N) __declspec(align(N)) - #else - #define SK_STRUCT_ALIGN(N) __attribute__((aligned(N))) - #endif -#endif - #if defined(_MSC_VER) && SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE2 #define SK_VECTORCALL __vectorcall #elif defined(SK_CPU_ARM32) && defined(SK_ARM_HAS_NEON) diff --git a/src/core/SkLinearBitmapPipeline.h b/src/core/SkLinearBitmapPipeline.h index 91b573df5d..d9fa97522e 100644 --- a/src/core/SkLinearBitmapPipeline.h +++ b/src/core/SkLinearBitmapPipeline.h @@ -57,6 +57,9 @@ public: void shadeSpan4f(int x, int y, SkPM4f* dst, int count); void blitSpan(int32_t x, int32_t y, void* dst, int count); + template + using Storage = typename std::aligned_storage::type; + template class Stage { public: @@ -84,11 +87,8 @@ public: private: std::function fStageCloner; - struct SK_STRUCT_ALIGN(16) Space { - char space[kSize]; - }; - bool fIsInitialized; - mutable Space fSpace; + mutable Storage fSpace; + bool fIsInitialized; }; /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -116,11 +116,8 @@ public: Base& operator*() const { return *(this->get()); } private: - struct SK_STRUCT_ALIGN(16) Space { - char space[kSize]; - }; - mutable Space fSpace; - bool fIsInitialized; + mutable Storage fSpace; + bool fIsInitialized; }; diff --git a/src/core/SkSmallAllocator.h b/src/core/SkSmallAllocator.h index 9095fa57fc..b39e359d52 100644 --- a/src/core/SkSmallAllocator.h +++ b/src/core/SkSmallAllocator.h @@ -93,7 +93,7 @@ public: // There is space in fStorage. rec->fStorageSize = storageRequired; rec->fHeapStorage = nullptr; - rec->fObj = static_cast(fStorage.fBytes + fStorageUsed); + rec->fObj = static_cast(bytes() + fStorageUsed); fStorageUsed += storageRequired; } rec->fKillProc = DestroyT; @@ -129,13 +129,11 @@ private: static_cast(ptr)->~T(); } - struct SK_STRUCT_ALIGN(16) Storage { - // we add kMaxObjects * 15 to account for the worst-case slop, where each allocation wasted - // 15 bytes (due to forcing each to be 16-byte aligned) - char fBytes[kTotalBytes + kMaxObjects * 15]; - }; + char* bytes() { return reinterpret_cast(&fStorage); } + + using Storage = typename std::aligned_storage::type; - Storage fStorage; + Storage fStorage[kMaxObjects]; // Number of bytes used so far. size_t fStorageUsed; uint32_t fNumObjects; -- cgit v1.2.3