×

日志分类

日志信息的分类级别包含哪些?C++allocator类 的使用

admin admin 发表于2022-04-28 11:43:00 浏览151 评论0

抢沙发发表评论

日志信息的分类级别包含哪些

OffOFF Level 是最高等级的,用于关闭所有日志记录。FATAL 致命的错误FATAL level 指出每个严重的错误事件将会导致应用程序的退出。ERROR 错误ERROR level 指出虽然发生错误事件,但仍然不影响系统的继续运行。WARN 警告WARN level 表明会出现潜在错误的情形。INFO 信息INFO level 表明 消息在粗粒度级别上突出强调应用程序的运行过程。DEBUG 调试DEBUG Level 指出细粒度信息事件对调试应用程序是非常有帮助的。TRACE与DEBUG 相比更细致化的记录事件消息。ALLALL Level 是最低等级的,用于打开所有日志记录。从高到地低OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL

C++allocator类 的使用

class StrVec{public: StrVec(): //默认初始化 elements(nullptr), first_free(nullptr), cap(nullptr){} StrVec(const StrVec &s)//拷贝构造函数 { //分配内存,大小与s一样 auto newdata = alloc_n_copy(s.begin(), s.end()); elements = newdata.first; first_free = cap = newdata.second; } StrVec &operator=(const StrVec &rhs)//拷贝赋值 { //分配内存,大小与rhs一样 auto data = alloc_n_copy(rhs.begin(), rhs.end()); free(); elements = data.first; first_free = cap = data.second; return *this; } ~StrVec()//析构 {free();} void push_back(const std::string&)//拷贝元素(别告诉我你没见过这个名字) { chk_n_alloc(); //检查空间 alloc.construct(first_free++, s); //构造s的副本(注意后置递增) } size_t size() const {return first_free - elements;} size_t capacity() const {return cap - elements;} //这些都是vector的名字,一个效果 std::string *begin() const{return elements;} std::string *end() const{return first_free;}//前面解释过了private: Static std::allocator alloc;//分配元素 void chk_n_alloc() { if(size() == capacity()) //分配的内存用完 reallocate(); //重新分配 } std::pair alloc_n_copy(const std::string*, const std::string*) { //分配空间 auto data = alloc.allocate(e - b); return {data, uninitialized_copy(b, e, data)}; } void free() //销毁元素释放内存 { //不能传递给deallocate一个空指针,如果为零,函数不作为 if(elements) { //逆序销毁旧元素(析构) for (auto p = first_free; p != elements;/*空下*/) alloc.destory(--p);//这里先递减,递减后的指针销毁 //这里释放内存空间 alloc.deallocate(elements, cap - elements); } } void reallocate()//重新分配内存 { //分配两倍的空间 auto newcapacity = size() ? 2 * size() : 1; //1的作用是因为0 * 2 = 0,使空元素分配一个空间 auto newdata = alloc.allocate(newcapacity); //将数据从旧内存移动到新内存 auto dest = newdata; auto elem = elements; for(size_t i = 0;i != size(); ++i) alloc.construct(dest++, std::move(*elem++)); free(); //更新数据结构 elements = newdata; first_free = dest; cap = elements + newcapacity; } std::string *elements; std::string *first_free; std::string *cap;//前面讲过};

在32位的系统,int类型最大值正数为2147483647,加1后溢出的结果 -2147483648,这是为什么

计算机中用补码来运算加减法,用补码计算-2147483647-1和2147483647+1都得到1000 0000 0000 0000 0000 0000 0000 0000,而加法溢出的结果在范围[-214748368,2147483647]中,故得到-214748368