非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
Non-type pointer and reference template parameters and how/why they are resolved at compile time. c++
我简单地问,当我传统上希望在运行时分配和使用内存时,为什么允许通过非类型模板传递对象/基元的内存位置。我知道传递内存的变量必须有外部链接,但鉴于此,这是否意味着外部链接变量的内存位置总是恒定的?举例说明:
template<std::string *temp>
void f();
难道每次执行程序时,通过模板传递的内存位置都会变化,因此不会像我认为的非类型参数所需的模板那样是编译时常数吗?
这类事情由运行时加载程序执行的修复来处理,地址确实会在运行时发生变化,但找到地址的位置始终位于加载的可执行映像的固定位置。
例如,ELF图像格式(目前在*nix上非常常见(具有重新定位部分,该重新定位部分告诉加载器程序中的哪些值需要以某种方式更改。编译器和链接器一起写入足够的信息,链接器能够在运行时生成最终值。
说你有功能:
void Foo::Bar() { }
然后稍后将其作为模板参数传递(非常做作(:
template<typename Class>
struct invoke {
template<void (Class::*Fn)()>
void do_fn(Class * ptr ) { (ptr->*Fn)(); }
};
..
Foo f;
invoke<Foo>::do_fn<&Foo::Bar>(&f);
Foo::Bar和实例化将在可执行映像中的某个特定地址找到,重新定位将告诉实例化的do_fn如何调用实际函数。请注意,do_fn函数名称本身不需要运行时地址,只需要以某种方式计算名称,即所有函数都调用:do_fn<amp;Foo::酒吧>((调用可以解析为单个专门化(每个翻译单元可能都有一个实例化,但链接器必须能够在一个定义规则下丢弃除一个之外的所有实例化,最好是选择哪个实例化无关紧要(。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- 为什么在运行时没有向我们提供有关分段错误的更多信息?