[Development] QHash iteration vs std::unordered_map

Thiago Macieira thiago.macieira at intel.com
Mon Apr 17 19:38:36 CEST 2017


Em segunda-feira, 17 de abril de 2017, às 09:48:26 PDT, Marc Mutz escreveu:
> On Monday 17 April 2017 18:08:20 Thiago Macieira wrote:
> > Em segunda-feira, 17 de abril de 2017, às 00:30:23 PDT, Marc Mutz 
escreveu:
> > > The problem with QT_STRICT_ITERATORS is _not_ that they are changing
> > > begin() and end(),
> > 
> > Actually, it was. You can't use QT_STRICT_ITERATORS in one TU and not in
> > other, regardless of exporting or not.
> 
> Why?

Well, now it can, because of this:

  iterator begin(iterator = iterator()) Q_DECL_NOTHROW { return data(); }
  iterator end(iterator = iterator()) Q_DECL_NOTHROW { return data() + size; }

Because of the parameter, the non-strict version calls begin(T*), whereas the 
strict one calls begin(QTypedArrayData<T>::iterator). Those are two different 
functions, with different name manglings. When they are emitted out-of-line 
and merged at link time, you'll have two copies, not one.

The difference is how the ABI returns the return value: a 
QTypedArrayData<T>::iterator is returned by implicit reference, whereas a 
pointer is returned by value. In the former case, the caller passes an 
implicit parameter to the storage area for the called function. In the latter, 
there is no parameter. So if the two functions had the same parameters (and 
thus the same mangling), the caller of the non-strict would not pass anything 
for the first parameter, causing the called strict begin() function to 
dereference an uninitialised pointer.

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center




More information about the Development mailing list