我和一位同事争论 lock_guard,他提出 lock_guard 可能比 mutex::lock() / mutex::unlock() 慢,因为实例化和非实例化类 lock_guard 的成本。
然后我创建了这个简单的测试,令人惊讶的是,带有 lock_guard 的版本几乎比带有 mutex::lock() / mutex::unlock() 的版本快两倍
#include <iostream>
#include <mutex>
#include <chrono>
std::mutex m;
int g = 0;
void func1()
{
m.lock();
g++;
m.unlock();
}
void func2()
{
std::lock_guard<std::mutex> lock(m);
g++;
}
int main()
{
auto t = std::chrono::system_clock::now();
for (int i = 0; i < 1000000; i++)
{
func1();
}
std::cout << "Take: " << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t).count() << " ms" << std::endl;
t = std::chrono::system_clock::now();
for (int …Run Code Online (Sandbox Code Playgroud) 我在玩 www.godbolt.org 来检查哪些代码会生成更好的汇编代码,但我不明白为什么这两种不同的方法会生成不同的结果(在汇编命令中)。
第一种方法是声明一个字符串,然后再设置一个值:
#include <string>
int foo() {
std::string a;
a = "abcdef";
return a.size();
}
Run Code Online (Sandbox Code Playgroud)
其中,在我的 gcc 7.4 ( -O3) 输出中:
.LC0:
.string "abcdef"
foo():
push rbp
mov r8d, 6
mov ecx, OFFSET FLAT:.LC0
xor edx, edx
push rbx
xor esi, esi
sub rsp, 40
lea rbx, [rsp+16]
mov rdi, rsp
mov BYTE PTR [rsp+16], 0
mov QWORD PTR [rsp], rbx
mov QWORD PTR [rsp+8], 0
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_replace(unsigned long, unsigned long, char const*, unsigned …Run Code Online (Sandbox Code Playgroud) 使用ANSI C99编写的旧代码我遇到了一个我不能理解的原型:
short GR_GetX (GR_Block new);
short GR_GetY (GR_Block new);
Run Code Online (Sandbox Code Playgroud)
IDE指示警告,但编译器不指示错误.
这个关键字有一些高级解释,或者只是编译器传递的旧错误?