This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Remove unordered containers iterators default initialization


On 11/26/2013 12:07 AM, Jonathan Wakely wrote:
On 25 November 2013 21:02, François Dumont wrote:
Hi

     Following N3644 discussion thread here is a patch proposal to remove
default zero-initialization of unordered containers iterator. I also took
the time to remove default zero-init of nodes _M_nxt pointer.

2013-11-25  François Dumont  <fdumont@gcc.gnu.org>

     * include/bits/hashtable_policy.h (_Hash_node_base): Default
     default constructor.
     (_Node_iterator): Likewise.
     (_Node_const_iterator): Likewise.
     * include/bits/hashtable.h: Adapt.

Tested under Linux x86_64.

Ok to commit ?
No, I still don't like the idea of leaving data intentionally
uninitialized, so I don't like this part of the patch:

Index: include/bits/hashtable_policy.h
===================================================================
--- include/bits/hashtable_policy.h    (revision 205288)
+++ include/bits/hashtable_policy.h    (working copy)
@@ -230,7 +230,7 @@
    {
      _Hash_node_base* _M_nxt;

-    _Hash_node_base() noexcept : _M_nxt() { }
+    _Hash_node_base() = default;

      _Hash_node_base(_Hash_node_base* __next) noexcept : _M_nxt(__next) { }
    };
@@ -306,6 +306,7 @@

        __node_type*  _M_cur;

+      _Node_iterator_base() = default;
        _Node_iterator_base(__node_type* __p) noexcept
        : _M_cur(__p) { }


I don't think that will help diagnose errors.

Dereferencing a null pointer will usually cause an immediate failure,
dereferencing uninitialized pointers can have more subtle, harder to
identify problems.

Ok, I see, it is not a Standard conforming issue but we prefer to be user friendly to performance. I was hoping to make all library iterators trivially default constructible and allow some good optimizations (even if std::is_trivially_default_constructible is not yet implemented).

Frankly, I think that detecting usage of uninitialized variables is a compiler job. Is it part of the compiler feature or on its TODOs list ?

François


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]