boost::lock_guard分配、构造函数和析构函数开销
boost::lock_guard allocation, constructor, and destructor overhead
我正在学习互斥锁,我看到,要使用锁保护,每次迭代都必须为锁保护分配内存,调用构造函数,然后调用析构函数。与永远不会超出范围的锁相比,这似乎可能是大量的开销。我了解锁罩的优势,但是通过避免它们,我可以节省多少时间?或者,换句话说,线程每次迭代的工作必须有多小才能使锁保护开销显着?
prepare_data();
{
boost::lock_guard<boost::mutex> lock(mut);
data_ready=true;
}
cond.notify_one();
不需要分配。编译器可以准确地看到构造函数和析构函数的作用,并优化任何内存分配或对象初始化的需求,或者调用特定构造函数或析构函数的任何需求。
它可以看到构造函数只调用互斥锁的锁定函数,析构函数只调用解锁函数。lock_guard
的地址永远不会被占用,因此不需要。
这是C++推荐RAII的关键原因之一 - 它通常没有任何成本。
编译器很可能必须在堆栈上分配空间来存储对lock_guard
析构函数的互斥锁的引用。它不太可能缓存它,因为 (a) 锁定/解锁互斥锁是外部函数调用,以及 (b) 函数施加内存围栏。但是锁定/解锁互斥锁的成本远高于与lock_guard
相关的其他操作,因此没有实际理由避免它。此外,现代编译器在堆栈管理方面具有非常有效的技术,并且为引用分配空间实际上可能是一个无操作。
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- C++:如果所有数据可能都已有效,则在构造函数中进行验证是否有开销
- boost::lock_guard分配、构造函数和析构函数开销