C++手动for循环拷贝对比std::copy出现数据损坏问题排查
BUG根因分析
你写的BUGGY版本循环逻辑没有遵守第一块写入长度j的限制,核心错误如下:
- 原逻辑中
j是std::min(n, headroom(i))的计算结果,代表第一块从位置i开始只需要写入j个字节,就能完成本次批量写入的第一部分 - 但你写的第一重循环是
for (; i < 127; i++),会直接把从i到缓冲区末尾的所有位置全部写满,而非只写j个字节,造成两个问题:- 输入迭代器
it会被额外向后偏移(127 - i) - j位,读取到输入范围外的无效数据,导致后续第二重循环写入的内容完全不是预期输入,自然出现乱码 - 额外写入的
(127 - i) - j个位置不属于本次reserve(n)预留的空间,还可能意外覆盖FIFO中还未被读出的有效数据
- 输入迭代器
你后续给出的修正版本完全对齐了std::copy版本的逻辑:先确认第一块只写j次,再从缓冲区开头写剩余的n-j个字节,自然不会出现数据错误。
其他优化建议
- 两个重载的
put函数入参std::vector<char>和std::string建议改为const&传参,避免每次调用都做一次容器拷贝,额外消耗性能 - 多线程场景下要注意原子变量的内存序设置,当前默认的
memory_order_seq_cst性能开销偏大,对于生产者消费者模型的FIFO可以针对性调整为acquire/release内存序进一步提升性能
内容的提问来源于stack exchange,提问作者Vroomfondel
相关产品推荐
相关产品推荐

