C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[14]: 型指定子を認識してくれない [1]


(過去ログ 45 を表示中)

[トピック内 29 記事 (21 - 29 表示)]  << 0 | 1 >>

■24101 / inTopicNo.21)  Re[12]: 型指定子を認識してくれない
  
□投稿者/ ネタ好き未記入 (54回)-(2008/08/27(Wed) 20:27:29)
No24099 (通りすがりのう〜 さん) に返信
> >>>たしか、『Modern C++ Design』にも載ってましたね。
> >>
> >>についですが、どこら辺に載っていましたか?
> >>勉強しなおしたいので教えていただけると助かります。
>>
>>何章だったか忘れましたが、たしか前の方の章だったような…
>>家に帰ったら調べてみます。
>
> 『2.10.3 パラメータ型の最適化』がそうです。
> また、5.12 節に使用例があります。
>

有難うございます。さっそく勉強します。
引用返信 編集キー/
■24103 / inTopicNo.22)  Re[10]: 型指定子を認識してくれない
□投稿者/ あんどちん (11回)-(2008/08/27(Wed) 21:46:28)
あんどちん さんの Web サイト
No24073 (ネタ好き未記入 さん) に返信
> 皆さん情報有難うございます。すごく勉強になります。
> 774RRさんの証明もためしました。
> Boost凄いですね。チャンとエラーが出る!
> (もしかして普通だったかな?)
>

勘違いしてたらごめんなさい。

ここのことですか?
> std::cout << &hint.get() << std::endl; // error! rvalue のアドレスを取ろうとした
> std::cout << &hstr.get() << std::endl; // ok! == &hstr.data
ここのことだったらBoost云々じゃなくてC++レベルの話です。

int ret_value() { return 1; }
int& ret_ref() { static int a; return a; }
の2つの関数を用意して
cout << &ret_value() << endl; // エラー
cout << &ret_ref() << endl; // 通る
でも同様にエラーが出るから。
整数値'1'のアドレスは取得できないけど、参照って様は(*value)だから。
&(*value)のアドレスは取得できますよね。

int* ret_ptr() { static int a; return &a; }
という関数を用意して
cout << &ret_ptr() << endl; // エラー(ポインタ値のアドレスは取れない)
cout << &(*ret_ptr()) << endl; // 通る
っていうのと同じことです。



引用返信 編集キー/
■24108 / inTopicNo.23)  Re[11]: 型指定子を認識してくれない
□投稿者/ あんどちん (13回)-(2008/08/27(Wed) 23:14:09)
No24077 (通りすがりのう〜 さん) に返信
> じつは単純なsetメソッド程度なら void set(const T& d) { data = d; } で十分なのかな?

だからそれだと折角型に応じて値渡しと参照を切り替えているcall_traits::param_typeの旨みが…
自分でテンプレートクラスや関数を作った時には利用者がどんな型を適用するか分からないので、型に応じて切り替えてくれるのがcall_traits::param_typeの利点な訳ですし。

引用返信 編集キー/
■24119 / inTopicNo.24)  Re[11]: 型指定子を認識してくれない
□投稿者/ ネタ好き未記入 (55回)-(2008/08/28(Thu) 07:01:21)
No24103 (あんどちん さん) に返信
確かにそれではcall_traits::param_typeの利点がさっぱりわかりません。
call_traits::param_typeはC++x0を待つしかないかな・・・
引用返信 編集キー/
■24128 / inTopicNo.25)  Re[12]: 型指定子を認識してくれない
□投稿者/ あー (1回)-(2008/08/28(Thu) 10:09:03)
2008/08/28(Thu) 10:09:53 編集(投稿者)
2008/08/28(Thu) 10:09:35 編集(投稿者)

No24108

void set(const T& d) { data = d; }
とかだったらどうせインライン展開されるから参照渡しにしててもコストは全くかからないだろう、ということでは?

No24119
> call_traits::param_typeはC++x0を待つしかないかな・・・

この話とC++0xに何の関係があるのかわかりません
引用返信 編集キー/
■24132 / inTopicNo.26)  Re[12]: 型指定子を認識してくれない
□投稿者/ 通りすがりのう〜 (5回)-(2008/08/28(Thu) 10:24:15)
No24108 (あんどちん さん) に返信
> > じつは単純なsetメソッド程度なら void set(const T& d) { data = d; } で十分なのかな?
>
> だからそれだと折角型に応じて値渡しと参照を切り替えているcall_traits::param_typeの旨みが…
> 自分でテンプレートクラスや関数を作った時には利用者がどんな型を適用するか分からないので、型に応じて切り替えてくれるのがcall_traits::param_typeの利点な訳ですし。
>

そこは私も理解しているつもりです。
ただ、最適化の話になると以下の2つになにか差はあるのかなと…

void set(int d) { data = d; }
void set(const int& d) { data = d; }

http://www.boost.org/doc/libs/1_36_0/libs/utility/call_traits.htm
の説明を読むと最適化の恩恵を受けられるのは
関数内のループで引数を使っている場合のようです。
他にも最適化されるケースがあるのかもしれませんが、
上のような単純なsetメソッドになにか特別な最適化を期待できるのかなと…
上の2つのsetメソッドで効率上の差がほとんどないのであれば
わざわざcall_traitsを使うまでもないような気がしたのです。
call_traitsが必要になる場合があるのは確かですが、
必要ないのであれば使わない方がコンパイル時間も短くなっていいかな…
なんてことを考えたりしてました。
引用返信 編集キー/
■24134 / inTopicNo.27)  Re[13]: 型指定子を認識してくれない
□投稿者/ ネタ好き未記入 (56回)-(2008/08/28(Thu) 10:40:07)
>この話とC++0xに何の関係があるのかわかりません

実装をまだ見ていなかったので、もしかしたらC++0x特有の機能を使用する事を想定しているのかな?
と考えました。
でも、後で考えると違う様な気もしていますw
引用返信 編集キー/
■24183 / inTopicNo.28)  Re[13]: 型指定子を認識してくれない
□投稿者/ あんどちん (14回)-(2008/08/29(Fri) 00:54:45)
No24128 (あー さん) に返信
> void set(const T& d) { data = d; }
> とかだったらどうせインライン展開されるから参照渡しにしててもコストは全くかからないだろう、ということでは?
成程。その通りですね。

No24132 (通りすがりのう〜 さん) に返信
> ただ、最適化の話になると以下の2つになにか差はあるのかなと…
>
> void set(int d) { data = d; }
> void set(const int& d) { data = d; }
>
無いですねw

とはいえ*最適化されれば(含インライン展開)*って事ですよね。
exportをサポートするコンパイラで実装分離されていれば最適化の有無に関係なく効果がありそうですが…
# それでも上記のset位ならクラスの宣言部に書きそう

書いてる事が必死でboost::call_traits::param_type擁護してるみたいで嫌だなぁw

引用返信 編集キー/
■24306 / inTopicNo.29)  Re[14]: 型指定子を認識してくれない
□投稿者/ ネタ好き未記入 (63回)-(2008/09/01(Mon) 14:31:55)
皆様有難うございます。
解決済みにするのを忘れていましたので解決済みにします。
解決済み
引用返信 編集キー/

<前の20件
トピック内ページ移動 / << 0 | 1 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -