该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
QArrayData::allocate直接上定义 在qarraydata.cpp第70行
QArrayData *QArrayData::allocate(size_t objectSize, size_t alignment,
size_t capacity, AllocationOptions options)
{
// Alignment is a power of two
Q_ASSERT(alignment >= Q_ALIGNOF(QArrayData)
&& !(alignment & (alignment - 1))); // Don't allocate empty headers
if (!(options & RawData) && !capacity)
return !(options & Unsharable)
? const_cast(&qt_array_empty)
: const_cast(&qt_array_unsharable_empty); size_t headerSize = sizeof(QArrayData); // Allocate extra (alignment - Q_ALIGNOF(QArrayData)) padding bytes so we
// can properly align the data array. This assumes malloc is able to
// provide appropriate alignment for the header -- as it should!
// Padding is skipped when allocating a header for RawData.
if (!(options & RawData))
headerSize += (alignment - Q_ALIGNOF(QArrayData)); // Allocate additional space if array is growing
if (options & Grow)
capacity = qAllocMore(objectSize * capacity, headerSize) / int(objectSize); size_t allocSize = headerSize + objectSize * capacity; QArrayData *header = static_cast(::malloc(allocSize));
if (header) {
quintptr data = (quintptr(header) + sizeof(QArrayData) + alignment - 1)
& ~(alignment - 1); header->ref.atomic.store(bool(!(options & Unsharable)));
header->size = 0;
header->alloc = capacity;
header->capacityReserved = bool(options & CapacityReserved);
header->offset = data - quintptr(header);
} return header;
}
Q_ASSERT不用看 只是一个警告 下面的if语句第一个条件肯定满足 第二个条件仅当传入空文本才调用 这里就不分析了 下面是关键部分:
size_t headerSize = sizeof(QArrayData);
执行后headerSize为16 接着判断语句会执行
headerSize += (alignment - Q_ALIGNOF(QArrayData));
楼下继续