#pragma once #include class MemoryPage; /// /// 内存页访问控制块 /// struct PageControlBlock { uint16_t active_entities_count = 0; // 活跃element数量,决定是否需要卸载 uint16_t byte_count_per_element = 32; // 单个element大小,16的倍数 uint32_t total_buffer_size = 0; // 可用数据缓冲区大小 uint64_t typecode_of_element = 0; // 元素类型标识码 uint64_t curr_access_usec = 0; // 最近访问时间点,lsb:us uint32_t acc_count_per_cycle = 0; // 单周期内累积访问次数 uint32_t un_used = 0; std::mutex access_protected; // 内存数据访问保护锁 }; /// /// 内存页面16K大小 /// class MemoryPage { private: PageControlBlock pcb; char data_buffer[16 * 1024 - (sizeof(PageControlBlock) / 8 + 1) * 8] = {}; public: /// /// 构建内存页 /// /// 原始element尺寸 explicit MemoryPage(uint16_t raw_element_size_16B, uint64_t typecode); /// /// 记录单次访问时间 /// /// void accessRecord(uint64_t timepoint_usec); /// /// 清除访问次数记录 /// /// 上一周期累积次数 uint32_t timesClear(); /// /// 获取访问记录 /// /// {最近访问时间,累积次数} std::pair getRecords() const; /// /// 加锁,在release之前不能访问本类型任何接口,否则会造成死锁 /// void lock(); /// /// 解锁 /// void release(); /// /// 获取element元素数据访问指针 /// /// 元素索引 /// 是否设置 /// 数据指针 char* getElementPtr(int index); /// /// 元素类型码 /// /// uint64_t elementTypeCode() const; /// /// 获取单个元素尺寸 /// /// 字节数量 uint16_t elementSize() const; /// /// 获取元素数量 /// /// uint16_t elementCount() const; }; /// /// 元素访问控制块 /// struct ElementControlBlock { uint8_t active_mark = 0; // 活跃标志 uint8_t backup_1 = 0; uint16_t byte_count = 16; // 该元素字节长度,16的倍数 uint16_t element_index = 0; // 本元素在Page中的索引 uint16_t backup_2 = 0; MemoryPage* page_refer = nullptr; // 页面关联指针 void* extend_bind = nullptr; // 绑定控制块内存指针 }; /// /// 内存元素访问接口 /// class MemoryElement { private: ElementControlBlock* const data_ptr; uint32_t buffer_offset = 0; public: static uint32_t validOffset(); static uint32_t rawSize(uint32_t data_type_size); /// /// 构建内存元素访问接口 /// /// MemoryElement(char* access_bind); /// /// 更新最终访问时间 /// /// void accessRecUpdate(uint64_t time_usec); /// /// 数据活跃状态 /// /// uint8_t isActived() const; /// /// 设置数据活跃状态 /// /// void setActive(uint8_t ste); /// /// 锁定数据,返回数据存储内存指针 /// /// char* dataLock(); /// /// 解锁数据 /// void release(); };