qstring如何初始化_以最优的方法初始化QString

本文探讨了QArrayData的allocate方法在初始化QString时的细节,重点关注了内存对齐、空数据处理和容量增长策略。通过分析源码,揭示了优化QString初始化的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

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));

楼下继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值