(我正在使用启用了LTO的GCC 5.3.0)
我有三种课程方法:
void method1(){
.
method2();
.
}
void method2(){
.
method3();
.
}
void method3(){...}
并且这些方法被安排为最大化缓存空间局部性。
我现在模板method2(),有两种可能的模板类型,生成两个版本的method2()
。
method2()的代码/指令是否仍然与method1()和method3()(如下所示)相邻,还是在其他地方分配的模板化方法?
void method1(){
.
method2();
.
}
template<typename T1>
void method2(){
.
method3();
.
}
template<typename T2>
void method2(){
.
method3();
.
}
void method3(){...}
我仍然希望将两个模板method2()
分配给method1()
和method3()
。
答案 0 :(得分:0)
关于如何将这些函数的目标代码安排在内存中的保证很少。
您可以使用-Wl,-Map=output.map
生成一个映射文件,它将告诉您链接器为各种函数分配的地址(假设它们是作为离散函数生成的,而不仅仅是内联代码)。 / p>
如果对地图文件的检查表明默认情况下链接器选择的位置并不能满足您的需求,那么有些方法可以强制实施(但对于模板,这可能有点不重要)。
链接器使用部分,因此要控制函数顺序,您需要使用函数的section属性为每个函数设置部分。由于您正在处理模板,我猜测(虽然我并不完全确定)您需要在您关注的每种类型上显式实例化模板,并使用该部分显式实例化的属性。
然后,您可以使用sections
命令编写链接描述文件,以告诉它在将对象放入可执行文件时排列对象中的部分的顺序。