【问题标题】:static_cast in template optimization during compilation编译期间模板优化中的static_cast
【发布时间】:2014-07-21 22:38:52
【问题描述】:

假设我有一个或多或少这样的功能(伪代码,不是真实的,所以请不要考虑它有多少没用:P):

template <typename T>
T function()
{
 std::vector<size_t> a = {1, 2, 3, 4, 5};
 T r = 0;
 for (size_t i=0; i<a.size(); ++i)
 {
  r += static_cast<T>(a[i]);
 }
 return r;
}

现在我想知道如果 T=size_t,编译器是否会优化 static_cast。我知道如果 T 是一个 int 没有太多的待办事项,但它会在编译时被优化或解决吗?

【问题讨论】:

  • 在大多数情况下(除了调用构造函数等),static_cast 不会生成任何代码,因此没有什么可以优化的。这是编译器以不同方式解释类型的编译时提示。如果无法显式转换类型(例如static_cast&lt;std::string&gt;(std::vector&lt;int&gt;())),编译器会发出错误。
  • @rashmatash: 像 float 到 int 这样的东西呢?使用 GCC 反汇编肯定会显示对 cvttss2si 的调用。可以参考相应的规范段落吗?
  • @thokra - 这就是我的想法,I3E 标准以与整数非常不同的方式保存位,所以我问 rashmatash - 你不能只复制位来注册。感谢这篇博文 thokra :) 无论如何,我们有点偏离了道路 - 问题是关于优化如果......而不是“在代码中做 static_cast 生成某事”。
  • 对于基本类型(例如 int、float、double),当数据类型需要不同的格式/寄存器时,将生成一些加载/存储指令。例如,“移动到”指令会将 int 的值加载到浮点数中。但是,当您编写 static_cast&lt;float&gt;(37) 时,通常不会生成额外的代码。
  • @rashmatash 嗯,这是一个不断折叠的例子。一般来说,intfloat 的转换至少需要一个操作码。

标签: c++ templates


【解决方案1】:

对于本机类型,任何现代编译器都应该将 static_cast 优化为相同的类型。这是同一问题的另一个答案,它表明具有非平凡复制构造函数的类型可能会导致开销。

Can static_cast to same type introduce runtime overhead?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    相关资源
    最近更新 更多