现代C ++编译器中多个线程中的内存分配是否会导致全局锁访问?编译器和操作系统之间的差异有多大?将少量数据放入预先分配的全局数组(不太干净,不太方便)而不是在个别线程需要时动态分配它有多少好处?
答案 0 :(得分:1)
所有线程共享一个公共虚拟地址空间,因此来自堆(malloc或new)的任何内存分配都将导致更新所有线程使用的虚拟地址空间。如何实现它将取决于操作系统和编译器。
如果分配的内存只需要功能范围并且不是太大,那么可以使用alloca()(或_alloca())来分配,它从堆栈中分配,这将是一个线程和函数的本地实例分配内存。
在我编写的多线程程序中,我使用了在启动时分配的消息和/或缓冲区“空闲”池,然后让线程“分配”并“释放”消息和/或缓冲区来自“免费”游泳池。