Index: base/lazy_instance.h |
diff --git a/base/lazy_instance.h b/base/lazy_instance.h |
index aaad3f7b2f2941ba64ec1aa617eeec201c86333f..99a000ed7d8eb135ae074ad1d0758e3f58101c54 100644 |
--- a/base/lazy_instance.h |
+++ b/base/lazy_instance.h |
@@ -41,7 +41,6 @@ |
#include "base/base_export.h" |
#include "base/debug/leak_annotations.h" |
#include "base/logging.h" |
-#include "base/memory/aligned_memory.h" |
#include "base/threading/thread_restrictions.h" |
// LazyInstance uses its own struct initializer-list style static |
@@ -55,7 +54,7 @@ namespace base { |
template <typename Type> |
struct LazyInstanceTraitsBase { |
static Type* New(void* instance) { |
- DCHECK_EQ(reinterpret_cast<uintptr_t>(instance) & (ALIGNOF(Type) - 1), 0u); |
+ DCHECK_EQ(reinterpret_cast<uintptr_t>(instance) & (alignof(Type) - 1), 0u); |
// Use placement new to initialize our instance in our preallocated space. |
// The parenthesis is very important here to force POD type initialization. |
return new (instance) Type(); |
@@ -195,7 +194,7 @@ class LazyInstance { |
#endif |
return static_cast<Type*>(internal::GetOrCreateLazyPointer( |
&private_instance_, |
- [this]() { return Traits::New(private_buf_.void_data()); }, |
+ [this]() { return Traits::New(private_buf_); }, |
Traits::kRegisterOnExit ? OnExit : nullptr, this)); |
} |
@@ -204,19 +203,31 @@ class LazyInstance { |
case 0: |
return p == NULL; |
case internal::kLazyInstanceStateCreating: |
- return static_cast<void*>(p) == private_buf_.void_data(); |
+ return static_cast<void*>(p) == private_buf_; |
default: |
return p == instance(); |
} |
} |
+ // MSVC gives a warning that the alignment expands the size of the |
+ // LazyInstance struct to make the size a multiple of the alignment. This |
+ // is expected in this case. |
+#if defined(OS_WIN) |
+#pragma warning(push) |
+#pragma warning(disable: 4324) |
+#endif |
+ |
// Effectively private: member data is only public to allow the linker to |
// statically initialize it and to maintain a POD class. DO NOT USE FROM |
// OUTSIDE THIS CLASS. |
- |
subtle::AtomicWord private_instance_; |
+ |
// Preallocated space for the Type instance. |
- base::AlignedMemory<sizeof(Type), ALIGNOF(Type)> private_buf_; |
+ alignas(Type) char private_buf_[sizeof(Type)]; |
+ |
+#if defined(OS_WIN) |
+#pragma warning(pop) |
+#endif |
private: |
Type* instance() { |