C++——volatile、const、constexpr、inline、static

volatile 和 const 修饰的变量说明该变量在本程序内不应被修改,但其它程序是可以修改的 volatile 修饰变量,告诉编译器不要优化该变量,每次取值都重新从内存中获取 constexpr 和 inline 修饰的变量,编译器都会进行编译期优化 当对 inline 修饰变量进行取地址操作时,优化会失效 inline 修饰函数相当于 static,只能在当前文件中访问 inline 修饰的变量可以用任意表达式初始化,但这样不保证被优化 inline 其它介绍 static 限制修饰的变量和函数的可见作用域(模块内部),其它的都是副本

September 1, 2022 · 1 min · Rick Cui

STL——map 排序相关

声明变量时指定排序规则 通过指定模板的第三个参数,对象类型,C++ 2a 支持 lambda 对象 struct MyCom{ bool operator()(const string key1, const string key2)const{ return key1 > key2; } }; int main() { // lambda 表达式对象 auto cmp = [](const auto& key1, const auto& key2){return key1 < key2;}; map<string, int, decltype(cmp)> myMap1 = {{"RAM", 20}, {"GPU", 15}, {"CPU", 10} }; // 函数对象 map<string, int, MyCom> myMap2 = {{"CPU", 10}, {"GPU", 15}, {"RAM", 20}}; for(const auto& item : myMap1){ cout << item....

August 30, 2022 · 1 min · Rick Cui

C++ 杂记

应用程序内存空间(局部内存堆),程序进程结束时,会被统一都回收释放 公共内存区(全局内存堆)(写设备驱动程序时会使用),使用不当会造成内存泄漏 extern 不能修饰其他模块的静态变量 函数内用 extern 修饰的变量要么来自全局变量,要么来自本身模块的静态变量 extern 只能修饰外部变量(就近原则),不能修饰局部变量 test.cpp: #include <iostream> int etn = 3; // 全局变量 static int s_m; // 模块静态变量 void layout() { std::cout << "test.cpp\tetn=" << etn << std::endl; } another.cpp: static int etn = 4; // 模块静态变量 void myFunc(){ int etn = 5; // 局部自动变量 { extern int etn; int x = etn;// x 是 4 而不是 5 } } charTest....

August 15, 2022 · 2 min · Rick Cui

C++11 关于右值引用、左值引用和通用引用的思考

一、通用引用 类型声明形式为 type&& 其中 type 类型是要进行推导的,如果类型推导没有发生,那么 type&& 代表一个右值引用 如果一个对象被声明为 auto&&,这个形参或者对象就是一个通用引用 通用引用,如果它被右值初始化,就会对应地成为右值引用;如果它被左值初始化,就会成为左值引用 如果在一个类模板里面看见了一个函数形参类型为 T&&,也不一定就是通用引用,可能并没有发生类型推导 void f(Widget&& param); //右值引用 Widget&& var1 = Widget(); //右值引用 auto&& var2 = var1; //通用引用(不是右值引用) template<typename T> void f(std::vector<T>&& param); //右值引用 template<typename T> void f(T&& param); //通用引用(不是右值引用) template <typename T> void f(const T&& param); //param是一个右值引用,因为添加了 const 限定符 // 函数模板 一般可能是通用引用 template <typename T> void print_reference_type(T &&i) { // T&& 或是 auto&& if (std::is_lvalue_reference<decltype(i)>::value) { std::cout << "lvalue: " << i << std::endl; } else if (std::is_rvalue_reference<decltype(i)>::value) { std::cout << "rvalue: " << i << std::endl; } else { std::cout << "unknown value: " << i << std::endl; } } // 因为 push_back 在有一个特定的 vector 实例之前不可能存在, // 而实例化 vector 时的类型已经决定了 push_back 的声明 // 所以在这里并没有发生类型推导 template<class T, class Allocator = allocator<T>> //来自C++标准 class vector { public: void push_back(T&& x); … } 一个记录任意函数调用的时间开销的函数模板...

June 11, 2022 · 2 min · Rick Cui

C 实现继承和多态

C中的继承和多态

May 24, 2022 · 1 min · Rick Cui