20899


floatとdoubleをtemplateによって抽象化しようと思っています。そこで次のようなtemplate関数を考えます。

[code]

    template <class T>
    T plus_one(const T& num) {
      return num + T(1.0);
    }
    
[/code]

1.0
はコンパイラーではdoubleになるので、とりあえずTでキャストしていますが、キャスティングにかかる負担を削減するため、次のように実際に使うdouble,
floatのために特殊化しています。

[code]

    template <>
    double plus_one<double>(const double& num) {
      return num + 1.0;
    }
    template <>
    float plus_one<float>(const float& num) {
      return num + 1.0f;
    }
    
[/code]

もし、1.0f と
float(1.0)がコンパイラー上で性能上の違いがなければ、上記のような特殊化はせずに元のtemplate関数だけで足りるはずです。1.0fとfloat(1.0)は違いがありますか？

そしてもし1.0fとfloat(1.0)で違いがあれば、M_PI みたいな定数をfloatで使いたい場合は仕方がなく

[code]

    #define M_PI_F (3.141592f)
    
[/code]

みたいな新たなマクロ変数を定義しなくてはならないのでしょうか？


CC BY-SA 3.0
2016-01-14T01:02:46.520
20898
2016-01-14T01:32:22.550
10856
question
c++
float number literal を使う場合にconstructorとの性能差はありますか？


例えば

[code]

    int x = 1 + 1;
    
[/code]

と記述した場合、`1 +
1`は定数式ですのでコンパイル時に計算され、実行時には直接`2`が使用されます。今回の場合、`T(1.0)`もテンプレート展開後には定数式ですのでコンパイル時にキャストされ、実行時には`1.0`や`1.0f`として扱われます。

不安であればアセンブリリストを出力し、直接確認されることをお勧めします。

* * *

この例に関しては、以下でいいかも。

[code]

    template <class T>
    constexpr T plus_one(T num) {
        return num + 1;
    }
    
[/code]


CC BY-SA 3.0
2016-01-14T01:23:04.050
20899
2016-01-14T01:32:22.550
2016-01-14T01:32:22.550
4236
4236
20898
answer