是否对不使用模板参数的模板化类的方法进行了编译器优化?

耶利米·沃卡图罗

例如

template< class T >
class Foo
{
public:
    float MethodUseOfT()
    {
        return m_bar.CalculateSomething();
    }
    float MethodNoUseOfT()
    {
        float blah(0.f);
        ...
        return blah;
    }

private:
    T m_bar;
};

class Bar
{
public:
    float CalculateSomething();
}

如果有人制作 a Foo<Bar>,大多数编译器是如何管理的;例如,他们通常会意识到MethodNoUseOfT不引用模板参数并使用该信息来减少生成的机器代码的大小吗?

此外,如果 的内容MethodUseOfT很大并且只有一行引用T,编译器是否会再次尝试重用为该方法的其余部分生成的机器代码?

马丁邦纳支持莫妮卡

也许。

Microsoft C++ 可以选择合并相同的函数(当然Foo<int>::MethodNoUseOfT()与 相同Foo<double>::MethodNoUseOfT())。

通常,此选项不符合标准(因为从函数模板生成的两个普通函数需要具有不同的地址,即使它们在其他方面相同)。但是,这不适用于这种情况,因为无法获得成员函数的地址(指向成员函数的指针与地址非常不同,而且比地址复杂得多)-因此链接器也许能够做到。

如评论中所述,唯一确定的方法是检查编译器+链接器的输出。

确定的简单方法是编写如下内容:

class FooBase
{
public:
    float MethodNoUseOfT()
    {
        float blah(0.f);
        ...
        return blah;
    }
};

template< class T >
class Foo : public FooBase
{
public:
    float MethodUseOfT()
    {
        return m_bar.CalculateSomething();
    }

private:
    T m_bar;
};

class Bar
{
public:
    float CalculateSomething();
}

如果这样做,您甚至可以将 的实现移动MethodNoUseOfT到 CPP 文件中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ML系列编译器是否对尾部调用进行了任何复杂的优化?

如何确定Swift是否使用优化进行了编译

编译器如何不使用size参数处理此模板化函数

Rust编译器使用“ loop”和“ while true”进行了哪些优化?

Java编译器是否针对不同的语言环境进行了翻译?

模板专业化与编译器优化

将int乘以30、31、32-编译器是否真的对它们进行了优化?(有效的Java这样说)

模板已使用比当前运行时版本更早的Handlebars进行了预编译

C / C ++优化编译器由于使用模板而损坏

编译器无法识别模板化类

模板模板参数和模板别名:编译器错误?

不使用模板参数的C ++模板类方法

C ++编译器不检查模板类中是否存在方法

对未使用的功能参数进行编译器优化

IEnumerable <T>,Task <T>和IDisposable是否在C#编译器中进行了硬编码?

编译器是否优化未使用的参数?

是否对克隆语句进行了优化?

模板类,不使用模板参数

编译器推断模板参数

Rust优化器为什么不删除那些无用的指令(在Godbolt编译器资源管理器上进行了测试)?

Saxon XSLT 处理器是否针对将隧道参数设置为其当前值进行了优化?

传递默认模板类型参数时,编译器选择模板专业化

微观优化,是否已通过现代浏览器进行了优化?

使用 using 别名成员模板 typedef 使编译器认为它不是类模板

模板布尔会被编译器优化吗?

编译器是否必须评估表达式是否取决于模板参数?

在XML文件中具有所有参数是否进行了优化?

使用模板参数实例化模板类

在C ++中,我专门对模板进行了实例化吗?