
2021-02-05-C++小笔记-模板模板参数-new出来的对象在堆栈区还是堆区
发布日期:2021-05-07 16:07:28
浏览次数:27
分类:精选文章
本文共 2088 字,大约阅读时间需要 6 分钟。
C++知识点整理
模板模板参数
模板模板参数是一种高级的C++特性,允许在模板参数中再嵌套另一个模板参数。这种技术虽然看起来只是为了玩玩,但实际上有其深层的应用场景。
templateclass List{public: List l; void show() { l.emplace_back(2); cout << *l.begin() << endl; }};template using List = list >;
this指针
this指针是C++中的一个重要概念,用于将对象方法的调用转化为对象方法的执行。虽然函数没有参数,但this指针仍然存在。它会被压栈到函数的最前面。
局部变量new出来的内存分布
new分配的内存位于堆栈区(或栈区),而不是堆区。例如,int* ptr = new int(2);
中,ptr
存在于堆栈区,而*ptr
指向的地址也属于堆栈区。
namespace dxgzg { templatevoid print(const T& t) { cout << t << endl; } template void print(const T& arg, Args ...args) { cout << arg << endl; return print(std::forward (args)...); }}
vector的emplace_back时间复杂度
虽然emplace_back
看起来是直接插入尾部,但由于需要扩容并进行数据复制,时间复杂度为O(N)。通过均摊复杂度分析,可以看出其在实际应用中的效率相当不错。
class Test2{public: Test2() : val4_(0) { val3_ = 0; val2_ = 0; val1_ = 0; } void show() { // 逐个输出成员变量的地址和值 }private: int val4_;};
local-static和non-local-static
全局静态变量属于non-local-static对象。为了解决不同编译单元间的初始化顺序问题,可以将其改为local-static,类似单例模式的做法。
Test& Singleton(){ static Test t; return t;}
构造函数初始化比赋值快
类的初始化(使用初始列表)比赋值快。例如,val_ = val
是赋值操作,而:val_(val)
是直接的构造函数调用。
class Test2{public: Test2(int val) : val_(val) { val_ = val; } void show() { }private: int val_;};
延后处理
在类的使用时,直接初始化比赋值快。例如,string fast = "hello";
比 slow = "hello";
快。
string slow;slow = "hello";string fast = "hello";
对象的初始化顺序
构造函数需要确保成员变量的初始化顺序与声明顺序一致。例如,Test2() : val4_(0)
确保了 val4_
的初始化顺序。
namespace dxgzg { templatevoid print(const T& t) { cout << t << endl; } template void print(const T& arg, Args ...args) { cout << arg << endl; return print(std::forward (args)...); } class Test2 { public: Test2() : val4_(0) { val3_ = 0; val2_ = 0; val1_ = 0; } void show() { // 输出所有成员变量的地址和值 } private: int val4_; };}