[Bug c++/79561] Missed optimization: useless guards for zero-initialized POD statics at function scope.
marc.mutz at kdab dot com
gcc-bugzilla@gcc.gnu.org
Thu Feb 16 20:15:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79561
--- Comment #1 from Marc Mutz <marc.mutz at kdab dot com> ---
For a moment, I thought it was about std::atomic, but a simple
template <class T> container { T t; }
instead of std::atomic<T> produces the same result.
So it seems like the = default ctor is the problem. If I remove all special
member functions, the guards disappear: https://godbolt.org/g/oZlR3o
====BEGIN====
#include <atomic>
#include <type_traits>
template <typename T>
struct container { T i; };
template <typename T>
class BasicAtomic
{
public:
container<T> v;
#if 0
BasicAtomic() = default;
constexpr BasicAtomic(T t) noexcept : v{t} {}
BasicAtomic(const BasicAtomic&) = delete;
BasicAtomic &operator=(const BasicAtomic &) = delete;
BasicAtomic &operator=(const BasicAtomic &) volatile = delete;
#endif
};
static_assert(std::is_pod<BasicAtomic<int>>::value, "oops");
static BasicAtomic<int> s_dyn;
int f(const char *str) {
while (*str++)
++s_dyn.v.i;
return s_dyn.v.i;
}
int f_dynamic_init(const char *str) {
static BasicAtomic<int> counter;
while (*str++)
++counter.v.i;
return counter.v.i;
}
int f_static_init(const char *str) {
static BasicAtomic<int> counter = {0};
while (*str++)
++counter.v.i;
return counter.v.i;
}
====END====
More information about the Gcc-bugs
mailing list