C++ Coding Style
auto
很多时候被滥用了,我们允许使用的场景:
- 模板类型(拼写较长)
for(int i=0; i<ssize(v); i++) {
// do sth
}
例如
Bad:
bool loadBonMAndBonS_win32(ArrayView<const char> bonm, ArrayView<const char> bons, Vector2i size) {
_scene.reset(new bon::Scene());
if(_scene->loadBonMAndBonS(bonm, bons, size)) {
_scene->resize(windowSize());
return true;
}
_scene.reset();
return false;
}
Good:
bool loadBonMAndBonS_win32(ArrayView<const char> bonm, ArrayView<const char> bons, Vector2i size) {
_scene.reset(new bon::Scene());
// 错误处理在前
if(!_scene->loadBonMAndBonS(bonm, bons, size)) {
_scene.reset();
return false;
}
// 成功操作在后
_scene->resize(windowSize());
return true;
}
一、入乡随俗,保持一致性
找出所有匹配的
std::wsmatch match;
std::wstring wstr(L"测试20220202010101");
if (std::regex_search(wstr, match, re) && match.size()) {
}
判断符不符合 if(!std::regex_match(_inputCaseId.c_str(), std::regex("[a-np-zA-NP-Z0-9]{4}"))) { }
在选择数据结构时应优先考虑 std::vector, std::array 这类顺序容器,他们天然是缓存友好的。
使用 phmap::flat_hash_map/set
替代 std::unordered_map/set
;
默认 btree_map/set
替代 std::map/set
, 但有两种意外:
- 当关联容器里面需要存储的值的长度大于 std::array<int32_t, 16> 时
- 插入/删除一个对象需要保证指向其他对象指针不失效
利用 moodycamel::ReaderWriterQueue 无锁队列 和 ksThread 实现生产、消费模式并发:
// 一、创建一个无锁读写队列,生产、消费线程共享
static ReaderWriterQueue<MySchemeInfo*> g_exportQueue(1024);
// 二、创建消费(读取)线程
static void ExportFunc(void*) {
MySchemeInfo* g_mySchemeInfo = nullptr;
while (g_exportQueue.try_dequeue(g_mySchemeInfo) && g_mySchemeInfo) {
// do something
}
}
ksThread g_exportThread;
ksThread_Create(&g_exportThread, "Export", ExportFunc, nullptr);
// 三、生产线程(主线程)
int main() {
// 程序主循环
MainLoop {
// 将数据塞入读写队列
g_exportQueue.try_enqueue(myScheme);
// 激活消费线程
ksThread_Signal(&g_exportThread);
}
}