質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

9823閲覧

constexprクラスの利点が分からない

JADEN

総合スコア106

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2016/03/15 14:25

標題の通りです。

constexprな基本型の利点は、コンパイル時定数により、実行速度が向上することだと理解できます。

クラスがリテラル型になる条件の一つは、「非staticデータメンバが、非volatileなリテラル型である」ことです。
引用サイト(3.9の最後、3.9.1の直前): C++11: Syntax and Feature
この条件のために、クラスをリテラル型にしても、できることが非常に限られたクラスになってしまいます。
ここまでして、リテラル型なクラスを使用する利点も、実行速度が向上することなのでしょうか。

追記
質問を書いていて思いました。
逆に、複雑なことをする必要がないクラスならconstexprにできるので、実行速度を向上させることができる、と考えることができるのかもしれません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ここまでして、リテラル型なクラスを使用する利点も、実行速度が向上することなのでしょうか。

クラスに限らず、constexprは速度向上が目的ではなく、コンパイル時に定数となることを保証するのが目的だと思います。従来からあるconstは、必ずしも定数とは限りませんからね。
これにより、従来なら関数や変数が使えなかった場所、例えば配列のサイズなどに使うことで、結果的に速度向上をもたらすということではないでしょうか。

逆に、複雑なことをする必要がないクラスならconstexprにできるので、実行速度を向上させることができる、と考えることができるのかもしれません。

これはあまり正しい認識ではないです。constexpr指定可能なコードであれば、constexprがなくても最適化によりコンパイル時点で結果が求まります。いわゆるテンプレートメタプログラミングに代表されるようなコンパイル時点で結果を求める手法はすでに存在していますから。
ただ、constexprを使えば、テンプレートメタプログラミングよりも直感的にコードが書けるという利点はあります。


訂正
他の環境では試していませんが、VC++で試したところ、再帰呼び出しなどの複雑な関数ではconstexprを付けるか付けないかで結果が変わりました。付けると定数に置き換わりますが、付けないと関数呼び出しになっていました。どうやら最適化のロジックにも影響を及ぼしているようです。

テンプレートメタプログラミングの例があるのでばっちり最適化してくれると思い込んでいたのですが、よく考えたら、テンプレートメタプログラミングは再帰呼び出しではなく、「メンバ変数の再帰的な使用」なので、ちょっと違っていますね。

その意味では、「実行速度を向上させることが目的」というのも間違いではないようです。

投稿2016/03/16 05:09

編集2016/03/16 12:47
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JADEN

2016/03/18 13:34

回答ありがとうございます。 テンプレートメタプログラミングを勉強するときに、また考えてみたいと思います。
guest

0

こんにちは。

私も頻繁に利用できるような利点ではない気がします。
でも、決定的な利点がありそうな印象です。あまり使わないけど、これがあるから初めてできるので非常にありがたいというような。

中3女子でもわかる constexprに解説があります。(リテラル型クラスのページは後日訂正されているようです。)
これを書いたボレロ村上氏が公開しているsproutではたくさん利点を使っていそうです。

普通に動的に処理する場合、ブレーク張ったりステップ実行したりprintfデバッグ等ができますが、コンパイル時処理ってそれらができないので、どうしても単純なものしか書けないです。なので、コンパイル時処理をデバッグできるようなデバッガが出てくればまた別かも知れません。Metashellというものがでているそうです。

投稿2016/03/16 03:41

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JADEN

2016/03/18 13:33

回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問