从汇编层去解释一下引用
- 9: int x = 1;
- 00401048 mov dword ptr [ebp-4],1
- 10: int &b = x;
- 0040104F lea eax,[ebp-4]
- 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>
\