#pragma once #include #include #include #include #include "BZStruct.h" /** * @brief 对象池模板类,用于重用对象以减少内存分配开销 */ template class ObjectPool { public: ObjectPool(size_t initialSize = 100, size_t maxSize = 1000) : m_maxSize(maxSize) { // 预分配初始对象 for (size_t i = 0; i < initialSize; ++i) { m_pool.append(new T()); } } ~ObjectPool() { QMutexLocker lock(&m_mutex); for (auto obj : m_pool) { delete obj; } m_pool.clear(); } /** * @brief 从对象池获取对象 */ QSharedPointer acquire() { QMutexLocker lock(&m_mutex); if (!m_pool.isEmpty()) { T* obj = m_pool.takeLast(); return QSharedPointer(obj, [this](T* obj) { this->release(obj); }); } else if (m_totalCreated < m_maxSize) { m_totalCreated++; T* obj = new T(); return QSharedPointer(obj, [this](T* obj) { this->release(obj); }); } // 如果池为空且达到最大限制,创建临时对象(不会被回收) return QSharedPointer(new T()); } /** * @brief 获取当前池大小 */ size_t size() const { QMutexLocker lock(&m_mutex); return m_pool.size(); } /** * @brief 获取已创建对象总数 */ size_t totalCreated() const { QMutexLocker lock(&m_mutex); return m_totalCreated; } private: void release(T* obj) { QMutexLocker lock(&m_mutex); if (m_pool.size() < m_maxSize) { // 重置对象状态 *obj = T(); m_pool.append(obj); } else { delete obj; } } private: QVector m_pool; mutable QMutex m_mutex; size_t m_maxSize; size_t m_totalCreated = 0; }; /** * @brief BigOrderInfo对象池单例 */ class BigOrderInfoPool { public: static BigOrderInfoPool& instance() { static BigOrderInfoPool pool; return pool; } QSharedPointer acquire() { return m_pool.acquire(); } size_t poolSize() const { return m_pool.size(); } size_t totalCreated() const { return m_pool.totalCreated(); } private: BigOrderInfoPool() : m_pool(100, 500) {} // 初始100个,最大500个 private: ObjectPool m_pool; }; /** * @brief 内存使用监控器 */ class MemoryMonitor { public: static MemoryMonitor& instance() { static MemoryMonitor monitor; return monitor; } /** * @brief 记录内存分配 */ void recordAllocation(size_t bytes, const QString& type) { QMutexLocker lock(&m_mutex); m_allocatedMemory[type] += bytes; m_totalAllocated += bytes; // 检查内存使用是否超过阈值 if (m_totalAllocated > m_memoryThreshold && !m_alertTriggered) { emitMemoryAlert(); } } /** * @brief 记录内存释放 */ void recordDeallocation(size_t bytes, const QString& type) { QMutexLocker lock(&m_mutex); m_allocatedMemory[type] -= bytes; m_totalAllocated -= bytes; } /** * @brief 获取当前内存使用情况 */ QMap getMemoryUsage() const { QMutexLocker lock(&m_mutex); return m_allocatedMemory; } /** * @brief 获取总内存使用量 */ size_t getTotalMemoryUsage() const { QMutexLocker lock(&m_mutex); return m_totalAllocated; } /** * @brief 设置内存告警阈值 */ void setMemoryThreshold(size_t threshold) { QMutexLocker lock(&m_mutex); m_memoryThreshold = threshold; } private: void emitMemoryAlert() { m_alertTriggered = true; // 这里可以发送信号或记录日志 qWarning() << "Memory usage alert: Total allocated" << m_totalAllocated << "bytes"; // 记录内存使用详情 for (auto it = m_allocatedMemory.begin(); it != m_allocatedMemory.end(); ++it) { if (it.value() > 0) { qWarning() << " " << it.key() << ":" << it.value() << "bytes"; } } } private: mutable QMutex m_mutex; QMap m_allocatedMemory; size_t m_totalAllocated = 0; size_t m_memoryThreshold = 100 * 1024 * 1024; // 100MB默认阈值 bool m_alertTriggered = false; }; // 内存分配跟踪宏 #ifdef MEMORY_TRACKING #define TRACK_MEMORY_ALLOC(bytes, type) MemoryMonitor::instance().recordAllocation(bytes, type) #define TRACK_MEMORY_FREE(bytes, type) MemoryMonitor::instance().recordDeallocation(bytes, type) #else #define TRACK_MEMORY_ALLOC(bytes, type) #define TRACK_MEMORY_FREE(bytes, type) #endif