cpp 12.21

80 阅读2分钟

从汇编层去解释一下引用

  1. 9: int x = 1;
  2. 00401048 mov dword ptr [ebp-4],1
  3. 10: int &b = x;
  4. 0040104F lea eax,[ebp-4]
  5. 00401052 mov dword ptr [ebp-8],eax

x的地址为ebp-4,b的地址为ebp-8,因为栈内的变量内存是从高往低进行分配的。所以b的地址比x的低。lea eax,[ebp-4] 这条语句将x的地址ebp-4放入eax寄存器mov dword ptr [ebp-8],eax 这条语句将eax的值放入b的地址ebp-8中上面两条汇编的作用即:将x的地址存入变量b中,这不和将某个变量的地址存入指针变量是一样的吗?所以从汇编层次来看,的确引用是通过指针来实现的。

符号表

记录变量名和变量名对应的地址


静态绑定

编译成 call

动态绑定

  • 通过指针来调用
  • 向上转型(有继承关系)
  • 调用的是虚函数

一个对象的内存为:虚函数指针+变量

其中虚函数指针指向虚函数表,虚函数表从父类继承,如果修改了虚函数那么修改对应的虚函数指针。

虚函数指针对应的表现形式为:

(*(p->vptr)[n])(p) 前面就是虚函数指针,可以直接当函数来用。

模板特化

特化,面对独特的类型做特别的设计。局部特征化。特化的优先级更高,会先找特化。


template <class Key>
struct hash{}; // 泛化template<>
struct hash<char> {
    size_t operator() (char x) const {return x;}
};
​
template<>
struct hash<long> {
    size_t operator() (long x) const {return x;}
};

cout << hash<long> ()(1000);

会优先调用特化实现,如果特化实现没有找到,再去找泛化实现。

模板偏特化

1,个数上的偏


template <typename T, typename Alloc=...>
class vector {
...
};
template <typename Alloc=...>
class vector<bool, Alloc>
{
...
};

部分类型要求固定,只保留部分模板参数。偏特化的类型要放在模板参数前面。

2,范围上的偏

指针指向任意类型。将范围缩小为指针类型。


template <typename T>
class C {
    ...
};
template <typename T>
class C<T*>
{
    ...
};
C<string> obj1;
C<string*> obj2;

模板模板参数

template<typename T,
        template <typename T>
            class Container
         >
class XCls {
private:
    Container<T> c;
public:
    ...
}
​
​
template<typename T>

\