从项目中学到的一些知识点

从C++开源项目中学到的一些知识点,包括C++和并发方面的内容

内存对齐 之 alignas

在学习日志系统的环形缓冲区设计时,学到了C++11中的内存对齐关键字alignas,于是查了一波资料。

参考blog:

字节对齐主要是为了提高内存的访问效率,比如intel 32位cpu,每个总线周期都是从偶地址开始读取32位的内存数据,如果数据存放地址不是从偶数开始,则可能出现需要两个总线周期才能读取到想要的数据,因此需要在内存中存放数据时进行对齐。


利用std::chrono获取当前时刻的精确到微秒的时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::time_t time_now_us = std::chrono::duration_cast<std::chrono::microseconds>((std::chrono::high_resolution_clock::now().time_since_epoch())).count();

std::time_t time_now_s = time_now_us / 1000000; // seconds
time_now_s += 28800; // UTC + 8
std::tm* time_now = std::gmtime(&time_now_s); // format

char buff[32], usbuff[7];
strftime(buff, 32, "%Y-%m-%d %H:%M:%S.", time_now);
sprintf(usbuff, "%06llu", time_now_us % 1000000);
cout << buff << usbuff << endl;

/*
output:
2022-10-22 00:09:29.651801
*/

C++17利用内存池加速

1
2
3
4
5
6
7
8
9
auto set_pmr = []{
static byte buffer [1 << 30];
static pmr::monotonic_buffer_resource pool {data(buffer), size(buffer)};
set_default_resource(&pool);
return 0;
}();

pmr::unordered_map<string, pmr::set<string>> mp[100];
pmr::unordered_map<string, pmr::set<string>> mp1[100];