2021-02-05-C++小笔记-模板模板参数-new出来的对象在堆栈区还是堆区
发布日期:2021-05-07 16:07:28 浏览次数:27 分类:精选文章

本文共 2088 字,大约阅读时间需要 6 分钟。

C++知识点整理

模板模板参数

模板模板参数是一种高级的C++特性,允许在模板参数中再嵌套另一个模板参数。这种技术虽然看起来只是为了玩玩,但实际上有其深层的应用场景。

template
class 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 {    template
void 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 {    template
void 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_; };}
上一篇:内联函数为什么会快?体积为什么会变大?
下一篇:C++小笔记-虚函数指针虚函数表

发表评论

最新留言

很好
[***.229.124.182]2025年05月17日 22时52分58秒