[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 20:36 / Filesize : 218 KB / Number-of Response : 953
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part78



1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part77
pc12.2ch.net/test/read.cgi/tech/1263556932/

112 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:58:46 ]
>>111
可変長引数パラメータって何?
関数引数の ... のこと?

113 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:23:46 ]
>>112
そうです。
使い方はわかるし、boostも使い方は理解できるんですが
何に使うのかがわからないんです。

特に後者のboostは、仮想関数の引数としてfunctionを利用しても
結局テンプレートだからオーバーロードになるわけですよね?
呼び出し側で型指定するわけですし、多態的に動作させるのもできないのでは?

ここで混乱している感じです。

114 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:26:48 ]
>>113
printf() とか。
まぁ C++ では基本的に使わないな。

boost::function とは関係ないと思うけど、何のこと言ってんの?

115 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:32:54 ]
>>114
返り値の型、引数の型を指定して関数ポインタを楽に生成できるじゃないですか。

このテクニックを利用して、引数の数、型が変化する処理を多態的にさせたいんです。

116 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:43:01 ]
>>113
可変長引数に関しては>>114に同じくprintfがいい例だと思う。
可変長引数は、C++ではあまり推奨おらず、printfに関してもboost::formatを使った方がいい。
ttp://www.kmonos.net/alang/boost/classes/format.html

boost::functionに関しては、引数の型(個数も含む)が違えば、boost::functionの型も変わる(boost::functionはクラステンプレートであってクラスそのものではない)。
テンプレートによる静的多態なので、仮想関数の動的多態のようには扱えない。

117 名前:116 mailto:sage [2010/02/17(水) 11:55:42 ]
付け加えておくと、
・可変長引数とboost::functionの使いどころは別である
・boost::functionは関数ポインタを使いやすくした物

あと、>>116の最後の行は紛らわしい書き方だった。
boost::functionの1つの具現化(戻り値と引数の型が同じ)においては、関数ポインタによる動的多態である。

118 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 12:11:45 ]
>>117
なるほど!
多態とはまた別物なんですね。
ボリモルフィズムが一気に広がるかもと思ったんですがね。

ありがとうございました。

119 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 12:22:49 ]
>>115
boost::function<void ()> で、引数は全部 bind するとか、
boost::function<void (std::vector<boost::any> const&)> で引数について型消去しながらやりくりするとか。

120 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:01:27 ]
(´;ω;`)さ、さ、さむいお



121 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:22:58 ]
利用者が仮想関数を呼び出す時、仮想関数の実装を知らなけば引数を渡せなくなって、ポリモーフィズムのメリットがなくなる気がするけど。

122 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 14:15:09 ]
いらない

123 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:13:58 ]
非ブロッキング、ロックフリー、ウェイトフリーの定義

www.gameenginejp.com/misc/2010/2010.html

124 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:37:29 ]
スレッドセーフのSTLクラスは使えるな。
boostのどのライブラリより上では。
boostにこんなのないだろ。

125 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:45:26 ]
ありますがな・・・

126 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:46:17 ]
ありませんがな・・・

127 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:50:33 ]
TBBの日本語サンプルサイトつくってくれよ。
マルチコア時代で、CPUメーカー製の、フリーのこのライブラリは強力すぎる。
できたら毎日クリックしに行くからさ。

ja.wikipedia.org/wiki/Intel_Threading_Building_Blocks

抜粋

並列処理アルゴリズム
parallel_for ループ間で依存性がない単純なループの並列処理
parallel_reduce 指定した範囲をより小さな範囲に再帰的に分割し並列処理
parallel_scan 並列プリフィックスを計算
parallel_while 不明領域、動的領域変更を伴う独立したループ操作
parallel_sort 並列処理でソートを行う
pipeline パイプライン処理

コンテナクラス
concurrent_hash_map STLのmapクラスをスレッドセーフにしたもの
concurrent_queue STLのqueueクラスをスレッドセーフにしたもの
concurrent_vector STLのvectorクラスをスレッドセーフにしたもの

128 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 16:13:42 ]
サンプルはないけど日本語リファレンスあるし間に合ってる感じ

129 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 18:53:08 ]
もうひとつだけ例を見てみましょう。
static LONG flag;
if (flag == FALSE) {
flag = TRUE;
...
flag = FALSE;
}



このコードがまずいことはもうお分かりですね。 NT にはフラグのチェックとセットをアトミックに行える InterlockedCompareExchange がありますから、そちらを使いましょう。
if (InterlockedCompareExchange(&flag, TRUE, FALSE) == FALSE) {
...
InterlockedExchange(&flag, FALSE);
}

hp.vector.co.jp/authors/VA000092/win32/standard-coding.html

130 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 18:58:30 ]


8スレッド
InterlockedIncrement 4.398sec
InterlockedCompareExchange 4.460sec
CriticalSection 6.297sec
d.hatena.ne.jp/streakeagle/20090205/1233833511

VC++ CriticalSectionの速度
何もないループが、0.515106秒に対しクリティカルセクションでは7.089556秒となった。
www.cycleof5th.com/tips/index.php?date=2007-05-30/3


同期オブジェクトの要約
速度
クリティカル セクション 高
ミューテックス 低
セマフォ 低
イベント 低
メータード セクション 高
msdn.microsoft.com/ja-jp/library/cc429052.aspx





131 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:08:05 ]
スレッドセーフなキューを複数個用意してキューにデータ来たら、
それぞれ直列に動作する関数を動かしたいんだけど
作業が終わったらキューを観察に行くけど無かった場合、次に入ってくるまで
どうやってまてばいいんだ? ひとつとしてビジーループはあるが。
それなら別変数用意してロック掛けた方が良い。ロック無しで出来る?
キューは一カ所にしてすべての処理関数スレッドで共有する方が無駄ないか。

132 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:22:53 ]
キューに挿入する側が、余りのスレッドを監視して空いてたら処理させればいいか。
これならロック無しでアトミック命令だけでいけそう。

133 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:24:54 ]
しかしスレッドを生成するコストも馬鹿にならないから
スレッドの生成・消滅はせず、恥に生成したやつを使い回したいところ。
やっぱロックいるか。処理終了してキュー待ちのロック。

134 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:27:47 ]
スレッドの生成は恥

135 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:41:16 ]
wait付きのビジーループでいいか

136 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:32:25 ]
C++でコルーチンってできないの?

137 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:32:53 ]
boostにあるにょ

138 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:35:08 ]
あるんだ
boostまじ何でもあるな
奴らはいったい誰と戦ってるんだ

139 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:37:11 ]
言われてみるとその言葉かなりしっくりくるよな。
C++の最適化に伴う変態記法なんて禿に親を殺されでもしない限りできないし。

140 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:39:02 ]
>>138
部品の足りない世界じゃないの?

というかWTLもC#並に充実させてください



141 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:45:06 ]
駆動系の部品はハイスペックだが
シートもハンドルもなく部品丸出しの車

142 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:47:45 ]
C++はC++です車ではありません
好い加減な比喩は滑稽なのでやめてください

143 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:48:41 ]
コルーチン
ttp://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3

Boost C++の何て言うライブラリで出来るのですか?

144 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:49:43 ]
boost.cotoutine
vaultにあるにょ

145 名前:デフォルトの名無しさん [2010/02/17(水) 20:52:04 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

146 名前:デフォルトの名無しさん [2010/02/17(水) 20:52:32 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

147 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:52:41 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

148 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:53:21 ]
車への例えがどれも的外れでワロスw

149 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:53:33 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

150 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:55:48 ]
だからといってヨソの車がそんなに安全かというと……



151 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:57:31 ]
>>144
valtですか。
ありがとうございます。


152 名前:デフォルトの名無しさん [2010/02/17(水) 20:58:22 ]
Boost.Coroutine
ttp://hamigaki.sourceforge.jp/doc/html/coroutine.html

2009-12-12 - melpon日記 - C++すら(ry
Boost][C++]Boost.勉強会の資料
ttp://d.hatena.ne.jp/melpon/20091212
ttp://melt.sytes.net/data/Boost.Coroutine.ppt
・Boost.Fiber という対抗馬も最近出てきた


153 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:59:10 ]
理想的には部品丸出しではないが、
バカが作ると部品を理解していなければならなくなる
仕様だな。


154 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:06:26 ]
マルチスレッドキューでロックしないサンプルできた。読み込むに失敗・キューがないときにwaitはいれたが。

#include "include/tbb/concurrent_queue.h"
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;


concurrent_queue<int> que;
int s[2]={0,0};

unsigned WINAPI fnc(void *n) {
int x,num=(int)n;
while(1) {
if( !que.try_pop(x) ) { Sleep(100); continue; }
if(x==-1)return 0;
s[num]+=x; }
}


int main() {
HANDLE hd[2];
int n;
for(n=0; n<2; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc,NULL, n ,NULL);
for(n=0; n<=1000; n++) que.push(n);
que.push(-1); que.push(-1);
WaitForMultipleObjects(2, hd, TRUE, INFINITE);
cout<< s[0]+s[1]<<endl;
getchar(); }

155 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:08:51 ]
0から1000まで足すだけ。キューへマルチスレッドでpush、popして
読み取って空いてるスレッドが足し合わせていくサンプル。
答えは合ってたよ。

156 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:10:28 ]
キューではロックしているだろうがな。そこを自作せずに済んだという話だ。

157 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:20:49 ]
プログラム組んでて
returnって打ったつもりだったら

tryit,

って打ってた
なんか感動した

158 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:21:46 ]
rをtにずらして打ってみると・・・!?

159 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:22:04 ]
ゴルゴはtrycatchfinallyを0.5秒でタイプするらしい

160 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:23:35 ]
>>157
夢を感じた



161 名前:デフォルトの名無しさん [2010/02/17(水) 21:33:09 ]
HDL ではごく普通というか大前提の話なんだが
直列処理という枠に凝り固まった頭で見ると驚きの連続なんだろうな

162 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:39:17 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

163 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:40:28 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

164 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:42:11 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

165 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:45:58 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

166 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:46:42 ]
パラメータになんか持たせるとか

167 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:57:56 ]
なにを?

168 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:01:15 ]
_beginthreadとCreateThreadは何が違うんですか?
というかどっちを使った方がいいんですか?

169 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:07:13 ]
>>167
判断できる情報を

>>168
適材適所。常にどちらかがよいということはない

170 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:11:21 ]
C++の配列サイズ指定で変数は使えることもあるんでしょうか?それともコンパイラ依存でしょうか?
MinGWで下をコンパイルは正常にでき(Warningも出ない)、arrayのsizeofは32byteとなってちゃんと確保されているようです。

#include <iostream>
using namespace std;
int main() {
int num = 3 + 5;
int array[num];
for (int i = 0; i < num; i++) {
array[i] = i;
}
cout << sizeof array << endl;
}




171 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:12:44 ]
正確にはC++ではなくC99で使える様になったはず

172 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:18:32 ]
>>170
gccの独自拡張

173 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:25:20 ]
>>168
CreateThreadはWindowsAPI、_beginthreadはCランタイム。

CreateThreadで生成したスレッドでCランタイム関数を使うとExitThreadしたときにわずかだがメモリリークが発生するため、
MSはそのような場合には_beginthreadを使うように推奨している。


174 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:32:21 ]
なるほど。
参考になりました。

unix - windows 互換のスレッド関係の関数は無いんですかね・・・

175 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:38:29 ]
Cランタイムって何?

176 名前:154 mailto:sage [2010/02/17(水) 22:41:42 ]
修正。引数渡す場所間違えて一スレッドしか動いていない。
#include "include/tbb/concurrent_queue.h"
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;
#define N 3
concurrent_queue<int> que;
int s[N];
unsigned WINAPI fnc(void *n) {
int x,num=(int)n;
while(1) {
if( !que.try_pop(x) ) { Sleep(100); continue; }
if(x==-1){ cout<<"正常終了number:"<<num<<endl; return 0;}
s[num]+=x;Sleep(rand()%50); }}

int main() {
HANDLE hd[N];
int n;
for(n=0; n<N; n++) s[n]=0;
for(n=0; n<N; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL);
for(n=0; n<=50; n++) que.push(n);
for(n=0; n<N; n++) que.push(-1);
WaitForMultipleObjects(N, hd, TRUE, INFINITE);
int sum=0;
for(n=0; n<N; n++) {cout<< "スレッド"<<n <<"の合計 "<<s[n]<<endl; sum+=s[n]; }
cout<<"総和 "<<sum<<endl;
getchar(); }

177 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:44:40 ]
>>174
pスレッド windowsというのがあるが、おすすめしない。
一度にアクセスが起きるとバグった経験有り。同じ物をwindowsの命令に書き換えたら動いた。
スレッドのどれか一つ or全部の終了待ちがない気がする。

178 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:47:23 ]

Open Source POSIX Threads for Win32
sourceware.org/pthreads-win32/


179 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:51:55 ]
一時期windowsであっても、linuxの互換コードで書くべきだという考えが起こり
全て統一しようとしたがPthread for winがうまく動作しないので諦めた経験ある。
現在の環境で生産性の良い、短いコードで済ますのが一番という考えになった。
完成品が出来なければ意味ない。完成していれば他OSへも移植しやすい。




180 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:00:42 ]
QtやBoostその他 ラッパライブラリじゃできないの?




181 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:02:56 ]
Qtもboostも標準にはいってないじゃん
サイズもでかいし
linuxでどこでも使えるのはPthreadだけでは

182 名前:180 mailto:sage [2010/02/17(水) 23:07:16 ]
>>181
その方、Pthreadはいつから標準になったと申すか。

183 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:09:31 ]
POSIX Threads, or Pthreadsのライセンスは
This implementation is free software, distributed under the GNU Lesser General Public License (LGPL).

え?誰も聞いてないって?


184 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:13:49 ]
入ってないlinuxはないんでは。c/c++がコンパイル可能な環境なら。

185 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:16:36 ]
標準っていうか、プリインストールって言いたかったわけか。


186 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:18:22 ]
ち、違うよ。

187 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 00:57:43 ]
どっちもbccでうごかん。 
lock-freeの高速キューを作ってくれよ。
インラインアセンブラ・マクロの特殊構文の多用が原因と思われる。
windows 標準のcas命令のみで頼む。

Thread Safe Template Library
sourceforge.jp/projects/freshmeat_tstl/

Intel Threading Building Blocks
www.threadingbuildingblocks.org/

188 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:43:02 ]
bccなんてポンコツ捨てろよ

189 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 04:41:14 ]
bccは毎年新規で販売してるんだぞ。
コンパイル速度速くて良いんだこれは。

190 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 04:49:50 ]
httpサーバーなどへIf-Modified-Sinceをつける場合statでファイルの更新日付を
取得してどのように変換すればいいのでしょうか?

日本時間に直すサンプルは見かけるのですがGMTのまま文字列化する方法が
わかりません



191 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:08:13 ]
スレッドセーフキューがマルチスレッドの要なんです
マクロやアセンブラ使わずに書いてくれると喜ばれますよ

192 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:22:15 ]
STLportがスレッドセーフなSTLだった
これつかお

193 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 11:43:35 ]
わざわざいうな

194 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:34:49 ]
>>190
strftimeじゃできないの?

195 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:14:32 ]
プロの方はスマートポインタを使うのが基本とのことですが、例えば引数なんかも
hoge( shared_ptr<Test>& sp )といったかんじになるんでしょうか?
それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
使い方ですか?

196 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:44:09 ]
参照渡しだよ

197 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:07:01 ]
STLportがbccでコンパイルできん

198 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/18(木) 20:43:01 ]
>>195
僕はクラスのメンバ関数が前提なら、
関数を所有するクラスがオブジェクトをメンバ変数に保持するときはスマートポインタを、
一時的に使うだけなら参照で渡します。

>それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
一番やっちゃいけない気がするんですけど・・・


199 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 21:44:30 ]
>>171 >>172
アドバイスありがとうございます。
手元のどの参考書見ても変数は使えないと書いてあってあれ?と思っていたしだいです。
Visual C++で使えないようなのでgccだけなんですね。

200 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:19:13 ]
>196 >19
ありがとうございます。
今試してみましたが同一ポインタを複数のshared_ptrに格納すると、
shared_ptrの数だけデストラクタが呼ばれてしまうんですね。
基本は参照で複製を作らないようにするということですね。



201 名前:デフォルトの名無しさん [2010/02/18(木) 22:21:29 ]
>>200
そう。
RAIIを徹底しろ。

202 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:21:59 ]
失礼しました。
>>196 >>198でした。

203 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:22:59 ]
g++やVC++などの有名どころのC++コンパイラについてお聞きしたいのですが、
コンパイル時定数を使った
ttp://codepad.org/EmT4J9d3
こんなifによる分岐があるとします。

このとき、成果物.exeはちゃんと最適化されて
分岐が消えるのでしょうか?

よろしくお願いします。


204 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:25:05 ]
codepadで使ってるg++とVC9.0では消失を確認

205 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:36:54 ]
ありがとうございます。
const bool ctc = 100; // compile-time constants

bool ctc = 100; // NOT compile-time constants
にしても同じでしょうか?
(volatileは付けません。)

お手数をおかけ致しますが、よろしくお願いします。



206 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:50:06 ]
const bool ctc = 100; // compile-time constants
に関しても同じ(キャストはちゃんとした方がいい)。
そもそも実行時への互換性を保たないと最適化というのはできないからね。

bool ctc = 100; // NOT compile-time constants
でも、単純にctcへの変更が無い事から最適化がなされた(204と同じ環境で)。
ただ、このケースは後のコードに完全に依存しているから考察する価値はあるのかどうか疑問だな。

207 名前:205 mailto:sage [2010/02/18(木) 23:02:24 ]
>>206
ご教示ありがとうございます。

そういったことは、どうやって調べればよいのでしょうか?
.asmを出力して調べているのでしょうか?


208 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:05:31 ]
>>207
そうだよ。

209 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:08:17 ]
YOUバイナリ読んじゃいなYO

210 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:08:49 ]
>>208
ありがとうございます。
asmからは逃げ回ってきているので全然読めそうにありません。
勉強しなければなりませんね。。。



211 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:09:33 ]
別に勉強しなくても片手間にasmの命令リストと見比べてるだけだけどね。

212 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:15:53 ]
asmってコンパイラやアセンブラによって
扱いが違うからやだ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<218KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef