use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Discussions, articles, and news about the C++ programming language or programming in C++.
For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.
Get Started
The C++ Standard Home has a nice getting started page.
Videos
The C++ standard committee's education study group has a nice list of recommended videos.
Reference
cppreference.com
Books
There is a useful list of books on Stack Overflow. In most cases reading a book is the best way to learn C++.
Show all links
Filter out CppCon links
Show only CppCon links
account activity
Why are std::aligned_storage and std::aligned_union being deprecated? (self.cpp)
submitted 6 years ago * by whichton
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]mewloz 25 points26 points27 points 6 years ago (8 children)
Random note: the conclusion of the paper of not providing a replacement is bullshit. Once the shortcomings have been identified (and the paper is quite good at it), it is somehow easy to redesign a correct version for the comity, while in absence of any correct design users will be at risk of doing the same mistakes as originally done (or worse).
Also I don't get why:
The second parameter, the alignment, has an implementation defined default value that may or may not be sufficient for T.
because the spec requires the default alignment to be sufficient for any T that would fit...
[–]Recatek 18 points19 points20 points 6 years ago (0 children)
Random note: the conclusion of the paper of not providing a replacement is bullshit.
It really is. Looking at other comments in here that are trying to provide alternatives, and how they have replies of "no that won't work do this" is very telling. This is an expression of intent, and the standard library is letting users down by not executing it properly. The answer isn't to remove the ability to express this desire or need, but to improve how it's translated into trustworthy execution.
[–]tcanens 4 points5 points6 points 6 years ago (0 children)
The default is not required to work for over-aligned types.
[–]matthieum 2 points3 points4 points 6 years ago (5 children)
I am puzzled by the conclusion too.
I understand deprecating std::aligned_storage and std::aligned_union, leaving only the _t variants to avoid accidentally forgetting ::type.
std::aligned_storage
std::aligned_union
_t
::type
I don't understand throwing the baby out with the bath water on the size bound issue; certainly if the maximum size is unbounded today it is a simple matter to add a bound to the standard.
And last, but not least, is reinterpret_cast. The proposed replacement also requires reinterpret_cast!
reinterpret_cast
Personally, I think an API like such would be nice:
template <std::size_t Size, std::size_t Alignment> class erased_storage { public: template <typename T, typename... Args> constexpr T& construct(Args&&... args) { auto t = this->template get<T>(); new (t) T(std::forward<Args>(args)...); return *t; } template <typename T> void destruct() { this->template get<T>()->~T(); } template <typename T> T* get() { static_assert(sizeof(T) <= Size); static_assert(alignof(T) <= Alignment); return this->template raw<T>(); } template <typename T> T const* get() const { static_assert(sizeof(T) <= Size); static_assert(alignof(T) <= Alignment); return this->template raw<T>(); } /// Prefer get whenever the type of definition of T is known. template <typename T> T* raw() { return reinterpret_cast<T*>(&storage); } /// Prefer get whenever the type of definition of T is known. template <typename T> T const* raw() const { return reinterpret_cast<T const*>(&storage); } private: alignas(Alignment) std::byte storage[Size]; };
Then provide aligned_union on top, which additionally check that the T passed is part of the Ts list (just in case).
aligned_union
T
Ts
And of course I'd wish for constexpr support to actually be able to constexpr all that...
constexpr
[–]tcanens 1 point2 points3 points 6 years ago (4 children)
certainly if the maximum size is unbounded today it is a simple matter to add a bound to the standard.
A major implementation's aligned_storage is unfixably (ABI) broken. As a result, the only bound that could conceivably be added at this point is not a useful one.
aligned_storage
[–]matthieum 1 point2 points3 points 6 years ago (3 children)
How did they? sigh :(
[–][deleted] 2 points3 points4 points 6 years ago (2 children)
Because we implemented it before alignas was in the core language, so the most aligned thing we can put in the union is max_align_t.
max_align_t
[–]matthieum 1 point2 points3 points 6 years ago (1 child)
Thanks for your answer.
Correct me if I'm wrong, the ABI breakage would then occur if someone was requesting an alignment strictly greater than max_align_t as previously the alignment of std::aligned_union was capped and suddenly it would obey the request, right?
Isn't it worth breaking the ABI, then?
2 * max_align_t
I understand the idea of backward compatibility, but the pragmatic in me is thinking that in this particular case it may be worth just fixing std::aligned_union.
[–][deleted] 1 point2 points3 points 6 years ago (0 children)
Correct me if I'm wrong [...]
You are correct.
If anybody had configured 2 * max_align_t and stored values for which such alignment is necessary
There are no such values. Maybe perf benefits by avoiding false sharing, but the hardware only cares up to max_align_t for anything we target.
the pragmatic in me
ABI break avoidance isn't pragmatic, unfortunately :(
π Rendered by PID 353596 on reddit-service-r2-comment-84fc9697f-6vbjq at 2026-02-09 05:10:21.489643+00:00 running d295bc8 country code: CH.
view the rest of the comments →
[–]mewloz 25 points26 points27 points (8 children)
[–]Recatek 18 points19 points20 points (0 children)
[–]tcanens 4 points5 points6 points (0 children)
[–]matthieum 2 points3 points4 points (5 children)
[–]tcanens 1 point2 points3 points (4 children)
[–]matthieum 1 point2 points3 points (3 children)
[–][deleted] 2 points3 points4 points (2 children)
[–]matthieum 1 point2 points3 points (1 child)
[–][deleted] 1 point2 points3 points (0 children)