【问题标题】:Where does templated method code get allocated?模板化方法代码在哪里分配?
【发布时间】:2016-09-06 09:23:36
【问题描述】:

(我使用的是启用 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()s 分配给method1()method3()

【问题讨论】:

  • 是什么让您认为编译器按照您编写代码的确切顺序放置指令?更糟糕的是,一旦优化器完成了您的代码(想想内联),您的原始订单就没有多少了。编译器会把热代码放在一起,声明的顺序没有意义。

标签: c++ performance gcc optimization compilation


【解决方案1】:

很少保证这些函数的目标代码将如何在内存中排列。

您可以使用-Wl,-Map=output.map 生成映射文件,该文件将告诉您链接器分配给各种函数的地址(假设它们是作为离散函数生成的,而不仅仅是内联代码)。

如果检查地图文件显示链接器默认选择的位置不能满足您的需求,您可以通过一些方法强制执行操作(但对于模板,这可能有点不重要)。

链接器与节一起工作,因此要控制函数顺序,您需要使用函数的节属性为每个函数设置节。由于您正在处理模板,我猜(尽管我不确定)您需要在您关心的每种类型上显式实例化您的模板,并在显式实例化上使用部分属性。

然后,您可以编写一个带有sections 命令的链接器脚本,告诉它在将对象中的部分放在一起放入可执行文件时的排列顺序。

参考文献

Function attributes
Linker sections command

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多