【发布时间】:2016-03-06 10:17:17
【问题描述】:
在处理某些数据流时,例如来自网络的请求,使用一些临时内存是很常见的。例如,一个 URL 可能被拆分为多个字符串,每个字符串都可能从堆中分配内存。这些实体的使用通常是短暂的,并且内存总量通常相对较小,应该适合 CPU 缓存。
在用于临时字符串的内存被释放时,字符串内容很可能只存在于缓存中。但是,CPU 不知道内存正在被释放:释放只是内存管理系统中的更新。结果,当 CPU 高速缓存用于其他内存时,CPU 可能最终将未使用的内容不必要地写入实际内存 - 除非内存释放以某种方式向 CPU 表明不再使用内存。因此,问题变成了:
释放内存的内存管理函数是否以某种方式表明相应内存的内容可以被丢弃? 有没有办法向 CPU 指示不再使用内存? (至少,对于某些 CPU:显然,架构之间可能存在差异)由于不同的实现可能会在质量上有所不同,并且可能会或可能不会做任何花哨的事情,问题真的是是否有 any内存管理实现将内存指示为未使用?
我确实意识到始终使用相同的内存区域可能是一种缓解策略,以避免对实际内存进行不必要的写入。在这种情况下,将使用相同的缓存内存。类似地,内存分配可能总是产生相同的内存,同时也避免了不必要的内存传输。但是,可能我不需要依赖任何适用的技术。
【问题讨论】:
-
一般来说,这是实现定义的。您能否将这个问题缩小到一种编程语言(C/C++ 不是一种编程语言)和可能的特定实现?否则我们很快就会到达“太宽泛”的领域。
-
@FUZxxl:Kühl 先生很清楚这些差异,我可以向你保证。但是 CPU 不知道它是在执行
free()还是delete,所以我们可以放心地忽略这些差异。 -
@FUZxxl:所以?问题是关于这些函数的实现。无论如何,这本质上是不可移植的代码,实际上问题在于 C 和 C++ 内存分配器对 CPU 缓存控制指令的使用。
-
@FUZxxl:
language-agnostic的问题是这个问题对 95% 的语言没有意义。而且我们没有“编译为本机应用程序的高性能语言,具有确定性显式内存释放”的标签。 -
@FUZxxl 对于许多主题,C 和 C++ 语言的许多问题都可以得到相同的回答;如果他们不能,那么区分这种区别是有用的。这样做的答案更丰富,因此我不会分享您对标记 [c] 和 [c++] 的反感。 OP 的问题是 a priori 特别容易有一个共同的答案,因为
glibc不太可能使用libstdc++没有的缓存技巧。顺便说一句,大多数语言的运行时/解释器都以某种方式基于 C 库之上!我也分享了 OP 对曝光不足的担忧,尽管获得了最大赏金,但仍有 88 次观看。
标签: performance memory memory-management dynamic-memory-allocation cpu-cache