gpt4 book ai didi

c++ - 性能与 C++ 内存模型

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:46 25 4
gpt4 key购买 nike

利用 C++11 的新共享内存并发特性,两个线程可以同时分配内存。此外,由于编译器事先不知道编译后的代码是否会同时由多个线程运行,因此它必须假设最坏的情况。因此,我的想法是编译后的代码必须以某种方式同步堆的行程。这会降低不需要同步的单线程代码的速度。

这是否与 C++ 格言“您只需为使用的东西付费”形成对比?开销是否小到不被认为是重要的? C++ 内存模型是否会减慢最终仅用于单线程的代码的其他领域?

最佳答案

堆管理器确实需要同步,这对于多线程代码来说可能是一个性能问题。如有必要,由程序来减轻这种情况。标准库也在使用react,试图获得更好的多线程分配器。

编辑:对第二段问题的一些思考。

即使是 C++ 也需要足够安全才能使用。 “YDPFWYU”很好,但如果这意味着如果您想在多线程环境中使用代码,就必须在每个分配周围包装一个互斥锁,那么您就有大问题了。这就像异常,真的:即使是不主动使用它们的代码也应该有点意识到它可能会在它们存在的上下文中使用,并且程序员和编译器都需要意识到这一点。编译器需要创建异常支持代码/数据结构,而程序员需要编写异常安全代码。多线程是一样的,只是更糟:你写的任何一段代码都可能在多线程环境中使用,所以你需要编写线程安全的代码,并且编译器/环境需要知道线程(放弃一些非常不安全的优化,并有一个线程安全的分配器)。

就标准而言,这些是 C++ 中的要点,即使您不使用的东西也要付费。您的特定编译器可能会给您一个逃生舱口(禁用异常,使用单线程运行时库),但那不再是真正的 C++。

也就是说,即使(或特别是)如果您有一个全局分配器锁,单线程程序的开销也是最小的:锁仅在争用时才昂贵。与分配器操作的其余部分相比,无争议的互斥锁定/解锁不是很重要。

在争论中,情况有所不同,这就是自定义分配器可能发挥作用的地方。

正如我在上面简要提到的,C++ 中的另一个地方由于多线程的存在而稍微变慢:禁止某些特定的优化。编译器无法在通常没有这些访问权限的代码路径中发明对可能的共享变量(如全局变量或您分发的指针指向的东西)的读写(尤其是写入)。这可能会减慢非常具体的代码片段的速度,但总体而言,在程序中,您不太可能会注意到。

关于c++ - 性能与 C++ 内存模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21261648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com