原始字符串字面量, 就不需要转义引脚. 原始字符串字面量以R"(开头, 以)" 结尾:
string str = R"(Hello World!)";
c++中 nullptr无法意识转换为整形, 但是可以隐式匹配指针类型, 在C++11校准下, 相比NULL和0, 使用nullptr初始化空指针可以领我们编写的程序更加健壮.
预处理, 编译, 汇编, 链接4个阶段
常量表达式和非常量表达式的计算时机不同, 非常量表达式只能在程序运行阶段计算出结果, 但是常量表达式和计算往往发生在程序的编译阶段, 这可以极大提高的执行效率,
建议 const 和constexpr 的功能区分开, 即凡是表达"只读" 语言的场景都使用const, 表达常量语义的场景都是用constexpr
在定义常量时, const 和 constexpr 是等价的,
const int m = f(); // 不是常量表达式, m的值只有运行时才会获取
const int i = 520; // 是一个常量表达式
const int j = i+ 1; // 是一个常量表达式
constexpr int i = 520; // 是一个常量表达式
constexpr int j = i + 1; // 是一个常量表达式
对于C++11内置类型的数据, 可以直接用constexpr 修饰, 但如果自定义的数据类型(用struct或者class实现), 直接用constexpr
修饰是不行的
std::lock_guard 用法:
创建lock_guard对象时,它将尝试获取提供给它的互斥锁的所有权。当控制流离开lock_guard对象的作用域时,lock_guard析构并释放互斥量。
它的特点如下:
创建即加锁,作用域结束自动析构并解锁,无需手工解锁
不能中途解锁,必须等作用域结束才解锁
不能复制
static std::mutex page_mutex;
void set_page(int page)
{
std::lock_guard<std::mutex> lock(page_mutex);
if(ui_page != TOOL_PAGE)
{
ui_page = page;
}
}
std::nothrow
1、在内存不足时,new (std::nothrow)并不抛出异常,而是将指针置NULL。
若不使用std::nothrow,则分配失败时程序直接抛出异常。
2、使用方式:
glog = new(std::nothrow) 对象;
if (glog == NULL)
{
return -1;
}
::fwrite_unlocked(&magic, 1, sizeof(int), _file);
应该是对文件近些写入操作, 知道怎么用就行
::fwrite_unlocked(&magic, 1, sizeof(int), _file);