summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJoão Abecasis <joao.abecasis@nokia.com>2012-02-17 12:10:03 +0100
committerQt by Nokia <qt-info@nokia.com>2012-02-22 17:37:29 +0100
commita1621d235dad75b8042f4e13712e1ea3440bf717 (patch)
treebd15927fd90a423745bf3004a96ad4c2e93f5d74 /tests
parenta5233b6b22e20bf249d8ae993a4224c6874abccf (diff)
Change QVector's in-memory data layout
The new layout matches that of QByteArrayData and QStringData, except for offset which is measured from the beginning of QVectorData, whereas in those classes it (still?) references the end of the header data. The new layout uses an extra member for storing an offset into the data, which will allow introducing QVector::fromRawData, similar to the same functionality already existing in QString and QByteArray. By not using an actual array to index array members, we also steer clear of GCC bug #43247: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43247 Change-Id: I408915aacadf616b4633bbbf5cae1fc19e415087 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/benchmarks/corelib/tools/qvector/qrawvector.h11
1 files changed, 7 insertions, 4 deletions
diff --git a/tests/benchmarks/corelib/tools/qvector/qrawvector.h b/tests/benchmarks/corelib/tools/qvector/qrawvector.h
index 1342513a7f..0fdfa86f1d 100644
--- a/tests/benchmarks/corelib/tools/qvector/qrawvector.h
+++ b/tests/benchmarks/corelib/tools/qvector/qrawvector.h
@@ -66,7 +66,7 @@ QT_BEGIN_NAMESPACE
template <typename T>
class QRawVector
{
- struct Data : QVectorData { T array[1]; };
+ typedef QVectorTypedData<T> Data;
T *m_begin;
int m_size;
@@ -265,15 +265,17 @@ private:
void realloc(int size, int alloc, bool ref);
void free(T *begin, int size);
+ class AlignmentDummy { QVectorData header; T array[1]; };
+
static Q_DECL_CONSTEXPR int offsetOfTypedData()
{
- // (non-POD)-safe offsetof(Data, array)
+ // (non-POD)-safe offsetof(AlignmentDummy, array)
return (sizeof(QVectorData) + (alignOfTypedData() - 1)) & ~(alignOfTypedData() - 1);
}
static Q_DECL_CONSTEXPR int alignOfTypedData()
{
#ifdef Q_ALIGNOF
- return Q_ALIGNOF(Data);
+ return Q_ALIGNOF(AlignmentDummy);
#else
return sizeof(void *);
#endif
@@ -286,7 +288,8 @@ public:
d->ref.initializeOwned();
d->alloc = m_alloc;
d->size = m_size;
- d->capacity = 0;
+ d->capacityReserved = 0;
+ d->offset = offsetOfTypedData();
QVector<T> v;
*reinterpret_cast<QVectorData **>(&v) = d;