电话
400 9058 355
News
LinkedList适用于双端O(1)增删、允许null、小数据量场景;不适用于随机访问、中间插入或大数据量,性能与内存开销常被高估。
Undo日志是InnoDB保障事务原子性与MVCC的核心逻辑日志,记录DML前的旧值或反向操作,用于回滚和快照读;按INSERT/DELETE/UPDATE类型分别生成,含trx_id等元信息,生命周期延续至不再被任何事务需要后由purge线程清理。
defer非零开销,每次调用需分配_defer结构体并链入goroutine链表;高频场景如Mutex.Unlock、HTTPhandler中Body.Close、循环内defer或带闭包defer会显著影响性能;应权衡可读性与性能,对简单操作直接调用,避免循环内及带参闭包defer,并用benchmark验证。
手写链表Queue需同时维护head和tail指针:push在tail端O(1),pop在head端O(1);Node构造函数必须显式初始化next为nullptr;判空统一用head==nullptr;拷贝需深拷贝或禁用。
List提供动态增删、按索引访问和插入顺序保障,而数组长度固定、操作繁琐;ArrayList适合随机访问,LinkedList仅在高频首尾操作且极少访问时适用。
splice是节点移动而非复制,不调用构造/析构函数,指针仍有效;仅限同类型同分配器list间操作;三种重载分别移动整个容器、单个节点或范围;目标迭代器不失效,源中被移节点的迭代器仍有效但不可用于原容器操作。
用std::list+std::unordered_map实现O(1)LRU缓存的关键是:用map映射key到list迭代器,通过splice快速移动节点至头部,淘汰时取back()并同步更新map;需注意splice参数合法性、迭代器有效性、put时的更新/插入逻辑顺序及线程安全限制。
Go中循环队列多用切片而非链表,因切片内存连续、缓存友好、无分配开销;需维护len字段避免空满歧义,读写索引用head和(head+len)%cap计算;高频操作应缓存模结果、批量copy;除非需零拷贝、水位控制或非阻塞批量,否则优先用原生chan。
邮箱:8955556@qq.com
Q Q:8955556