C#とC++/CLIとVBと.NETとWindowsで戯れる
string a = "A" + "B";
ってどうなると思います?
ildasmでMSILにすると
string a = "AB";
になっています。
コンパイラもちょっとは賢いですね。(^^
だから、Staticな文字列を連結するだけなら、StringBuilderは不要ってこってす。
ご自身でご確認を・・・
投稿日時 : 2004年12月15日 22:11
文字列だけではなく、たいていの数値型も同様です。 まぁあたりまえですけど。 この辺は最適化オプション云々以前のようですね。
なんでしょうねぇ。(^^;;; 今までのアセンブリコードだとここまで検証しなかったし。 MSILだからみてるってかんじですね。(^^
これ、ちょっと気になってました。 ためになりました。
> 今までのアセンブリコードだとここまで検証しなかったし。 C++ でも見てあげてくださいよぉ(笑) 結構がんばってるんですからw たとえばこんなの。 C++ template はコンパイル時解決なので、 template<int N> struct SUM { enum { X = N + SUM<N - 1>::X }; }; template<> struct SUM<0> { enum { X = 0 }; }; int _tmain(int argc, _TCHAR* argv[]) { int sum = SUM<5>::X; return 0; } なんてのも、たとえ最適化無しのデバッグビルドでも mov dword ptr [sum],0Fh だけになっちゃいます。 ( SUM<5>::X を展開すると 5+4+3+2+1+0 になりますから当然といえば当然ですが)
なるぽど、奥が深いなぁ...。 そういうところまで、頭が回るようにします。
これ確かCぐらいから仕様じゃなかったかな?(計算できる式は結合) 仕様じゃないと BYTE buf[ 640*480 ]; みたいなのが許可されなくなってしまうので。C#では確かに気にする必要のない(なくなった)ことなんだけど。
数字はわかるけど、文字列もしてたんですねぇ。 C#では仕様だかどうだかは不明です。暇なら調べます。
わ。上の private const string Bar = "aaa" + "bbb" + "ccc"; です。
Powered by: Copyright © 中博俊