怎样在 C++里用 C-style 按行读取文件并不分配 heap 内存?

讨论 未结 15 37
dangyuluo
dangyuluo 会员 2022年9月14日 05:12 发表
<p>同事的破要求,按行读取一个文件,不让用 ifstream ,仅仅是因为“We don't have a precise understanding of how much memory the program will allocate”。想用<code>getline</code>但是<code>getline</code>也会分配内存。请问有没有什么现成的轮子?谢谢。</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
15个回复
  • Jirajine
    2022年9月14日 06:44
    那就用 read 手写?自己在栈上静态分配 buf ,读到 buf 里自己按换行符拆分。
    0 0
  • nightwitch
    2022年9月14日 10:45
    按行读取 不用堆 来个 100M 的单行文件必定栈溢出
    0 0
  • GeruzoniAnsasu
    2022年9月14日 10:45
    看描述怎么感觉 ABproblem 你 precisely alloc 一块 heap 来做 buffer 不行么
    0 0
  • iyeatse
    2022年9月14日 10:45
    你可以跑个 benchmark ,给他一个 precise understanding
    0 0
  • haolongsun
    2022年9月14日 11:44
    不知道 size 有多大?还敢在栈上存?
    0 0
  • cnbatch
    2022年9月14日 13:13
    可以反问你的同事一句:那你能精确知道文件的每一行有多长吗?你能保证文件每一行不会超出预分配的固定大小? 重点在于“你能保证吗?” 言外之意就是:“出了事你负责”。
    0 0
  • cnbatch
    2022年9月14日 13:13
    如果你的同事被要求“出了事你负责”还不怂的话,那就正好,把相关保证言论保存下来(最好能放到 Git 记录里面),一旦栈溢出就甩锅给他
    0 0
  • chenzhongxiang
    2022年9月14日 13:13
    我的实践是可以用 mmap ,逐个字符扫描检查换行,不过不允许分配堆内存你拿到了一段比较长的行(例如 1MB ,这个问题的关键就是你压根就不知道一行会有多长)你后续的使用也会有诸多棘手的地方。 更好的实践是不用过多纠结分配堆内存,C 程序员通常应该清楚自己在做什么,合理的分配堆没有任何问题。有一段时间我也尽量避免使用堆内存,错误的以为这样可以提升性能。后来逐渐的意识到没啥必要,你看看 glibc 的源码很多你认为很简单的函数都使用堆内存。你们的项目质量要求比 glibc 还高么。 个人的常规见解。实际项目可能在某个点就是要求苛刻,那就需要妥善的考虑全局。
    0 0
  • sockpuppet9527
    2022年9月14日 13:42
    建议离职,能提出这种不合理的需求的公司可太行了,另外即使是 heap 分内存,也通过类似代理的方式统计。
    0 0
  • mingl0280
    2022年9月14日 13:42
    这个需求太傻 x 了,这么搞肯定栈溢出(正常的栈空间才 8M ),太蠢了…… 除非你按定长字节读取(当然这个效率也不行)
    0 0
  • villivateur
    2022年9月14日 14:13
    不用 heap 的话,要不在 ZI 区域先定义 1 个 G 的全局变量吧(狗头)
    0 0