■過去ログ置き場に戻る■ 1- 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part48
1 名前:v(^・^)v :2006/03/15(水) 20:53:15
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

  → テンプレその他 >>1-15 付近参照 ←

前スレ
C++相談室 part47
http://pc8.2ch.net/test/read.cgi/tech/1139931895/l50

2 名前:v(^・^)v :2006/03/15(水) 20:54:04
http://piza.2ch.net/tech/kako/980/980175292.html
http://pc.2ch.net/tech/kako/996/996640937.html
http://pc.2ch.net/tech/kako/1003/10038/1003832761.html
http://pc.2ch.net/tech/kako/1009/10090/1009071535.html
http://pc.2ch.net/tech/kako/1014/10142/1014217496.html
http://pc.2ch.net/tech/kako/1018/10184/1018454705.html
http://pc.2ch.net/tech/kako/1021/10217/1021787032.html
http://pc3.2ch.net/tech/kako/1025/10250/1025010364.html
http://pc3.2ch.net/tech/kako/1027/10273/1027347982.html
10 http://pc3.2ch.net/tech/kako/1029/10293/1029315669.html
11 http://pc3.2ch.net/tech/kako/1032/10323/1032345774.html
12 http://pc3.2ch.net/tech/kako/1035/10350/1035005882.html
13 http://pc3.2ch.net/tech/kako/1038/10380/1038031395.html
14 http://pc5.2ch.net/tech/kako/1041/10413/1041328679.html
15 http://pc5.2ch.net/tech/kako/1043/10436/1043605481.html

3 名前:v(^・^)v :2006/03/15(水) 20:54:48
16 http://pc5.2ch.net/tech/kako/1045/10457/1045746245.html
17 http://pc5.2ch.net/tech/kako/1047/10475/1047560042.html
18 http://pc5.2ch.net/tech/kako/1050/10501/1050177746.html
19 http://pc5.2ch.net/tech/kako/1052/10526/1052625846.html
20 http://pc5.2ch.net/tech/kako/1055/10551/1055162298.html
21 http://pc5.2ch.net/tech/kako/1057/10575/1057580107.html
22 http://pc5.2ch.net/tech/kako/1060/10603/1060361082.html
23 http://pc5.2ch.net/tech/kako/1062/10626/1062690663.html
24 http://pc5.2ch.net/tech/kako/1066/10665/1066546387.html
25 http://pc5.2ch.net/tech/kako/1067/10679/1067949669.html
26 http://pc5.2ch.net/test/read.cgi/tech/1070164402/ (迷子)
27 http://pc5.2ch.net/test/read.cgi/tech/1074454641/ (迷子)
28 http://pc5.2ch.net/test/read.cgi/tech/1077985164/
29 http://pc5.2ch.net/test/read.cgi/tech/1082047479/
30 http://pc5.2ch.net/test/read.cgi/tech/1084030770/

4 名前:デフォルトの名無しさん :2006/03/15(水) 20:56:15
31 http://pc5.2ch.net/test/read.cgi/tech/1086185282/
32 http://pc5.2ch.net/test/read.cgi/tech/1088236078/
33 http://pc5.2ch.net/test/read.cgi/tech/1090180012/
34 http://pc5.2ch.net/test/read.cgi/tech/1092018643/
35 http://pc5.2ch.net/test/read.cgi/tech/1093958200/
36 http://pc5.2ch.net/test/read.cgi/tech/1096304546/
37 http://pc5.2ch.net/test/read.cgi/tech/1098543578/
38 http://pc5.2ch.net/test/read.cgi/tech/1101473340/
39 http://pc5.2ch.net/test/read.cgi/tech/1106466303/
39(実質40) http://pc8.2ch.net/test/read.cgi/tech/1106527792/
40(実質41) http://pc8.2ch.net/test/read.cgi/tech/1113408957/
41(実質42) http://pc8.2ch.net/test/read.cgi/tech/1120190961/
43 http://pc8.2ch.net/test/read.cgi/tech/1124113879/
44 http://pc8.2ch.net/test/read.cgi/tech/1128512737/
45 http://pc8.2ch.net/test/read.cgi/tech/1133007604/
46 ttp://pc8.2ch.net/test/read.cgi/tech/1136690107/

5 名前:v(^・^)v :2006/03/15(水) 20:56:48
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)


6 名前:v(^・^)v :2006/03/15(水) 21:00:04
■Books■
amazon.com C,C++関連書籍
 http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 ttp://www.amazon.com/exec/obidos/ASIN/0201700735/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 ttp://www.amazon.com/exec/obidos/ASIN/0201824701/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 ttp://www.amazon.com/exec/obidos/ASIN/0201379260/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201924889/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 ttp://www.amazon.com/exec/obidos/ASIN/020163371X/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/0201615622/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 ttp://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 ttp://www.amazon.com/exec/obidos/ASIN/0201760428/
C++ Coding Standards
 ttp://www.amazon.co.jp/exec/obidos/ASIN/0321113586/
 ttp://www.amazon.co.jp/exec/obidos/ASIN/4894716860/ (翻訳)


7 名前:v(^・^)v :2006/03/15(水) 21:04:57
■Books(Templateまわり)■
Effective STL
 http://www.amazon.com/exec/obidos/ASIN/0201749629/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 http://www.amazon.com/exec/obidos/ASIN/0201704315/
 http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 http://www.amazon.com/exec/obidos/ASIN/0321227255/

8 名前:デフォルトの名無しさん :2006/03/15(水) 21:05:38
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache STDCXX http://incubator.apache.org/stdcxx/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://www005.upp.so-net.ne.jp/episteme/html/stlprog/
 (日本語) http://www.wakhok.ac.jp/~sumi/stl/
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

9 名前:デフォルトの名無しさん :2006/03/15(水) 21:09:55
■関連スレ■
【初心者歓迎】C/C++室 Ver.25【環境依存OK】
 http://pc8.2ch.net/test/read.cgi/tech/1140963340/l50
【C++】STL(Standard Template Library)相談室 4
 http://pc8.2ch.net/test/read.cgi/tech/1130680264/
C/C++の宿題を片付けます 62代目
 http://pc8.2ch.net/test/read.cgi/tech/1141363718/
C/C++でのWindowsPrograming議論スレ(質問お断り)
 http://pc8.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!! 002
 http://pc8.2ch.net/test/read.cgi/tech/1139043535/
C++/CLI について語ろうぜ  Part2
 http://pc8.2ch.net/test/read.cgi/tech/1142147319/l50
くだすれC++/CLI(初心者用)
 http://pc8.2ch.net/test/read.cgi/tech/1142144110/l50
ATL/WTL Part4
 http://pc8.2ch.net/test/read.cgi/tech/1134388951/
【雑談】C/C++【その1】
 http://pc8.2ch.net/test/read.cgi/tech/1098817686/l50

10 名前:デフォルトの名無しさん :2006/03/15(水) 21:10:26
STLつかうと一気に実行ファイルサイズが10倍に?!

11 名前:デフォルトの名無しさん :2006/03/15(水) 21:59:56
>10
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。

12 名前:デフォルトの名無しさん :2006/03/15(水) 22:02:36
具体例くらい挙げれば?>>10

13 名前:デフォルトの名無しさん :2006/03/15(水) 23:10:25
>>11
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

14 名前:デフォルトの名無しさん :2006/03/15(水) 23:11:08
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>

後氏ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。


15 名前:デフォルトの名無しさん :2006/03/16(木) 00:18:06
プロジェクトのプロパティで、"プリコンパイル済みヘッダーを作成する"にする
というかVSすれに行ってくらはい。

16 名前:デフォルトの名無しさん :2006/03/16(木) 01:40:12
>>12,>>15
新参者を発見しますた。(・∀・)ニヤニヤ
そういやもう春休みの時期かぁ。

17 名前:デフォルトの名無しさん :2006/03/16(木) 07:24:29
なんで変なところまでテンプレになるの?
某厨房板の地鎮祭みたいなものか?


18 名前:デフォルトの名無しさん :2006/03/16(木) 11:22:38
新参者を見つけてニヨニヨするスレはここですか?

19 名前:デフォルトの名無しさん :2006/03/16(木) 11:40:19
なんでただでさえ長いテンプレに変なもんつけるんだか。

20 名前:デフォルトの名無しさん :2006/03/16(木) 12:41:45
あっちこっちから参照されるサブ関数はC++の場合どうするのが
いいんでしょうか?
サブ関数をまとめたクラスを作って使用もとでフレンド宣言とかでしょうか?
アドバイスよろしく

21 名前:デフォルトの名無しさん :2006/03/16(木) 12:50:47
>>20
サブ関数とやらは全部適当なnamespaceに放り込んどけ。

22 名前:デフォルトの名無しさん :2006/03/16(木) 12:53:58
>>20 なんでフレンド?
てけとーなクラス作って、
public static な関数にしてしまえばいいんじゃない?
まぁ >>21 みたく namespace でもいいけどさ。

23 名前:デフォルトの名無しさん :2006/03/16(木) 14:42:17
namespace mylib {
 namespace math {
 // 数学関係の関数
 }
 namespace graphics {
  // 画像関係の関数
  namespace io {
   // 画像関係の入出力
  }
 }
 namespace utility {
 }
 ....
}
のようにしてる。適当なnamespaceの中に、用途別のnamespaceがある感じ

24 名前:20 :2006/03/16(木) 17:09:21
ありがとぅん
家に帰たら挑戦してみます。

25 名前:デフォルトの名無しさん :2006/03/16(木) 18:38:10
>>22
Javaじゃないんだからw

26 名前:デフォルトの名無しさん :2006/03/17(金) 21:33:22
>>前スレ998
http://pc8.2ch.net/test/read.cgi/tech/1139931895/998

で、ある特定のライブラリ「boost」がその実装を想定していなかったとして
ケツを持ち込む相手は?

# あんた、K さんだろ?

27 名前:デフォルトの名無しさん :2006/03/17(金) 21:38:21
なんでケツが関係あるの?さっぱりわかんね。
亜ふぉで素か?

28 名前:デフォルトの名無しさん :2006/03/17(金) 22:06:54
おろっ? K じゃなかったか・・・ これは失礼

# はー、つまんね

29 名前:デフォルトの名無しさん :2006/03/17(金) 22:34:39
>>28
いや、俺だって。俺、俺!

30 名前:デフォルトの名無しさん :2006/03/17(金) 23:01:11
俺は?

31 名前:デフォルトの名無しさん :2006/03/17(金) 23:11:32
俺も?

32 名前:デフォルトの名無しさん :2006/03/18(土) 06:50:08
あれかい?
デリートしたオブジェクトポインタは直後にNULLにしといた方が初心者には何かと安心かい?

33 名前:デフォルトの名無しさん :2006/03/18(土) 06:52:02
うん

34 名前:デフォルトの名無しさん :2006/03/18(土) 06:55:43
二重 delete が起きるコードなんてたいていバグってんだから、
バグ発覚の可能性を除去するなんて勿体無いとおもう。

35 名前:デフォルトの名無しさん :2006/03/18(土) 07:34:06
もしコピーコンストラクタが代入に対処できていたら、大変な事になってましたね。
左辺が、意図したデータを持ってる時の代入か、はたまた初期化の時の単なるゴミデータか判別できませんもんね。
ゴミの時にメソッドなんか呼ぼうもんなら終了ですもんね。

以上、今日の日記。

36 名前:デフォルトの名無しさん :2006/03/18(土) 11:02:56
初めてconstの有用性を知ったとき、関数の引数をconst参照で渡す効能を知ったとき、
あるいは前置++, --演算子の後置に対する効率上の違いを知ったとき等、
人は十字軍になるものなんだろう。Effective C++にも書いてあるけれど。

何事も行き過ぎはよくないという一例だな。


37 名前:デフォルトの名無しさん :2006/03/18(土) 16:18:16
>>34
>たいていバグ
じゃなくて、明らかなバグ
でも、delete 後 NUL代入する「信仰」は後を絶たない
何故だろう??
即落した方が、遥かに有用だと思うのだが

38 名前:デフォルトの名無しさん :2006/03/18(土) 16:26:34
すぐエラーで落ちるとは限らない

39 名前:デフォルトの名無しさん :2006/03/18(土) 17:05:06
>>37
delete 自体は問題なくてもデストラクタが複数回呼ばれちゃいかんだろ?
で、デストラクタがあるオブジェクトかどうかでNULLは代入したりしなかったりするのはナンセンスだろ?

40 名前:デフォルトの名無しさん :2006/03/18(土) 17:46:15
>>37
たとえば、T型へのポインタの配列へのポインタT** ptrをメンバに持ち、要素をクリアするメソッドを定義すると

void clear() {
 if (ptr) {
  for (int i = 0; i < size(); ++i) delete ptr[i];
  delete[] ptr;
  ptr = 0;
 }
}

このclear()は、もしptrに0を代入していなければ、二度呼び出された時点で不正になる。

要素が存在する場合に限ってclear()を呼び出せるような仕様にするより、
いかなる場合でもclear()は要素をクリアするような仕様の方が、見通しがいいと思う。

if (!my_container.empty()) my_container.clear(); // 要素が空かのチェックつき。こう書くより
my_container.clear(); // こう書けば、要素のあるなしに限らずクリアしてくれる方が、私は嬉しい

ただし、最初のdeleteループでは、各要素に0を代入したりはしない。
すぐ次のdeleteで、各要素にアクセスできなくなるからね。

41 名前:デフォルトの名無しさん :2006/03/18(土) 17:51:57
>>40
void clear() {
if (empty()) return;

42 名前:デフォルトの名無しさん :2006/03/18(土) 17:59:42
オブジェクトの初期化を ob = 1 ってできないようにすれば
代入時にはコピーコンストラクタが呼び出せないのは
簡単にわかるのにっておもいました。

以上C++学習中の今日の日記

43 名前:http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 18:16:58
名ソフト TextSS の64bit化ってできない?

44 名前:デフォルトの名無しさん :2006/03/18(土) 18:22:21
仕様的にdeleteのNULLチェックは入らないって話をどこかで見た覚えがある。
if(!foo) delete foo;

delete foo;
で良いって話。
つまり重複開放も問題ない気がする。

45 名前:デフォルトの名無しさん :2006/03/18(土) 18:26:36
http://support.microsoft.com/default.aspx?scid=kb;ja;194550

46 名前:デフォルトの名無しさん :2006/03/18(土) 18:27:53
ちがうー。deleteにヌルを渡しても無視してくれるだけだ。
恐ろしい勘違いをしているぞ。

47 名前:デフォルトの名無しさん :2006/03/18(土) 18:30:29
>>45
ちとMSを尊敬

48 名前:デフォルトの名無しさん :2006/03/18(土) 18:44:13
>>37
MS のせいだな。 >>45 とか SAFE_〜() とか。

みんな auto_ptr() 使えばこんな議論も要らないのに。
スコープから外れる直前のポインタを delete したときはヌル埋めは不要。
スコープに残ってるポインタを delete したときはヌル埋めは有効。
auto_ptr() がうまく働いてくれる。

49 名前:デフォルトの名無しさん :2006/03/18(土) 19:01:06
パフォーマンスを気にしたいところでは auto_ptr 使いたくなかったりするんだお

50 名前:デフォルトの名無しさん :2006/03/18(土) 19:04:47
そういや昔同じはなしになったときに、生ポインタと比べてどれだけ遅いのか計ってた香具師がいたな
結果はきれいさっぱり忘れてしまったが

51 名前:デフォルトの名無しさん :2006/03/18(土) 19:11:44
>>49-50
全部インラインで実装できるからパフォーマンスに影響は無いはずなんだけど。
実測して言ってるの? >49

52 名前:デフォルトの名無しさん :2006/03/18(土) 19:13:04
インライン化はされるとは限らないんだお

53 名前:デフォルトの名無しさん :2006/03/18(土) 19:17:12
インライン化はされないとは限らないんだお

54 名前:デフォルトの名無しさん :2006/03/18(土) 19:20:13
>>53
だから遅くなるかもしれないことは避けるんだお

55 名前:デフォルトの名無しさん :2006/03/18(土) 19:24:07
>>51
インラインで実装「できる」ことと
インラインで実装「しなければならない」ことは
ちゃんと区別しないと、どこへ行っても文盲扱いされるぞ

56 名前:デフォルトの名無しさん :2006/03/18(土) 19:34:31
>>54
そんなこと言ってたら標準のテンプレートも boost もほぼ全滅だな。正気か?

57 名前:デフォルトの名無しさん :2006/03/18(土) 19:40:56
「パフォーマンスを気にしたいところで」と言ってるんだお
そういうところでは boost なんてもってのほかだお

58 名前:51 :2006/03/18(土) 19:45:50
>>55
あぁ「インラインで実装」じゃ意味がわからないな。
「全部インライン展開できるはずだから〜」に言い換えておこう。

59 名前:デフォルトの名無しさん :2006/03/18(土) 19:47:00
>>57
速度は実測が基本。
原因が明らかになる前にコードを劣化させるなんてもってのほか。

60 名前:デフォルトの名無しさん :2006/03/18(土) 19:47:19
まあ、deleteの話に戻るが、例外処理で判定すんのが面倒だからNULL代入してるだけ。
一律 delete 並べれば良いだけだから。


61 名前:デフォルトの名無しさん :2006/03/18(土) 19:50:59
>>60
それも auto_ptr のほうがいいだろ。

62 名前:デフォルトの名無しさん :2006/03/18(土) 19:51:46
やっぱり実測しろって展開になったw
誰かやれよ

63 名前:デフォルトの名無しさん :2006/03/18(土) 20:06:32
>>39
> delete 自体は問題なくてもデストラクタが複数回呼ばれちゃいかんだろ?
一つのインスタンスに対してデストラクタが
複数回呼ばれるロジック自体がおかしい、直すべきだと思う

>>40
>>41の通り、あんまし理由になっていない希ガス

>>60
> まあ、deleteの話に戻るが、例外処理で判定すんのが面倒だからNULL代入してるだけ。
ごめん、意味判らない


64 名前:デフォルトの名無しさん :2006/03/18(土) 20:58:11
自分でdelete呼んだら
もうそのコードは間違っているという認識だけどな
Boostでdeleteを検索すると
ptr_containerさえ一個もなかったりする

65 名前:デフォルトの名無しさん :2006/03/18(土) 21:06:40
直接 I/O したら
もうそのコードは間違っているという
のと同じ論法だな

66 名前:デフォルトの名無しさん :2006/03/18(土) 21:09:46
>>65
むしろそっちのほうがまだ納得できる理屈なんだが

67 名前:デフォルトの名無しさん :2006/03/18(土) 21:41:21
>>66
せいぜい、間違ったコードでレスしてくれたまえ

68 名前:デフォルトの名無しさん :2006/03/18(土) 22:15:58
コンストラクタ・デストラクタにくくって話をしてる奴と、話をしてない奴がいる。


69 名前:http://www.vector.co.jp/soft/win95/util/se072729.html :2006/03/18(土) 22:29:13
TextSS のWindowsXP(Professional)64bit対応化おながいします

もしくは64bitにネイティブ対応したテキスト置換ソフトありますか?

そういや64bitにネイティブ対応している2chブラウザてありましたっけ?




70 名前:デフォルトの名無しさん :2006/03/18(土) 23:49:02
auto_ptrのパフォーマンスを気にするのなら、そもそもc++を選択しているのが
間違っているような気が……

まあ、パフォーマンス気になる部分をクラスに切り出して、その中でチューニング
するのが程良い妥協案じゃない?


71 名前:デフォルトの名無しさん :2006/03/18(土) 23:50:45
boost::scoped_ptrは?
それすら嫌なら自分で作れば?

72 名前:デフォルトの名無しさん :2006/03/18(土) 23:52:28
質問です。
数値を取るようなテンプレートを用いたクラスを作成し、継承して利用します。
たまたま2箇所で同じ数値を渡して特殊化した場合、staticメンバが
共有されるのはしょうがないことですか?

文章だけだとわかりにくいので例で。
サイズをTで渡すと、継承したクラスのインスタンス数をカウントし、
そのメモリ容量を返す以下のクラスを考えます。

template <int T> class Count{
public:
  static int num;
  Count(){num++;}
  ~Count(){num--;}
  
  static int getmem(){ return num * T;}
};

template <int T> int Count<T>::num = 0;




73 名前:デフォルトの名無しさん :2006/03/18(土) 23:52:45
ここで、以下のようにクラスA,B,Cを作ります。
A,Bはサイズが同じ。

class A : public Count<8>{
  int i,j;
};

class B : public Count<8>{
  long long l;
};

class C : public Count<16>{
  long long l,m;
};

int main(int argc,char** argv){
  A a1,a2,a3;
  B b1,b2;
  C c1,c2,c3,c4;
  
  printf("A = %d\n",A::getmem()); //8*3=24を期待
  printf("B = %d\n",B::getmem()); //8*2=16を期待
  printf("C = %d\n",C::getmem());
}



74 名前:デフォルトの名無しさん :2006/03/18(土) 23:52:51

Aは3つ、Bは2つインスタンスがあるので、printfした時は24,16が
表示されて欲しいのに、ともに40が表示されてしまいます。

このような現象を防ぐ方法はありませんか?

(Countが<int T>をとるのではなく、<class T>として<A>や<B>、<C>で特殊化し、
 getmemではnum*sizeof(T)なら対応できるのはわかるのですが、
 今回はこのCountに相当する部分がライブラリで変更できない)


75 名前:デフォルトの名無しさん :2006/03/19(日) 00:01:57
void foo1(){
...
++bar;
...
}
void foo2(int hoge){
...
bar*=hoge;
...
}
上記のように、一部分だけ違う関数が必要なんです。
引数が変わり、また非常に多く呼び出される関数なのですが、
重複したコードを書かないようにする、コストの低い良い方法ってないでしょうか?

76 名前:デフォルトの名無しさん :2006/03/19(日) 00:03:02
>>72-74
Count が変更できないなら無理。
そのライブラリの設計ミスか、そのライブラリが
想定していない使い方をしてるんだろう。

77 名前:デフォルトの名無しさん :2006/03/19(日) 00:06:44
>>75
void foo_first(int& bar);
void foo_last(int& bar);
void foo1() { int bar; foo_first(bar); ++bar; foo_last(bar); }
void foo2() { int bar; foo_first(bar); bar*=hoge; foo_last(bar); }

first をコンストラクタ、 last を

78 名前:77 :2006/03/19(日) 00:08:05
ごめんしくじった。

first をコンストラクタ、 last をデストラクタとし、
int bar をメンバとするクラスを作るといいかも。

79 名前:デフォルトの名無しさん :2006/03/19(日) 00:14:11
その、一部分だけ違うところを、関数オブジェクトをとるようにするとか。

80 名前:デフォルトの名無しさん :2006/03/19(日) 00:30:04
>>77
ネストの深い所にあって、前後を分割できないんです・・・

>>79
引数の数や型が違う場合に上手く出来たでしょうか?
ちょっとやってみます。

81 名前:デフォルトの名無しさん :2006/03/19(日) 00:37:48
>>80
boost::bindなんかを使って引数の数などを揃える。

82 名前:デフォルトの名無しさん :2006/03/19(日) 01:27:58
>>70
> auto_ptrのパフォーマンスを気にするのなら、そもそもc++を選択しているのが
> 間違っているような気が……

その理論だと、すべて「アセンブラでかけ」という結論になっちゃうよ。
極論房はこれだからダメなんだよ。

ソフト開発に極論はありませんがな。


83 名前:デフォルトの名無しさん :2006/03/19(日) 01:41:18
auto_ptr のパフォーマンスを疑うようなやつはコンパイラ実装者を馬鹿にしすぎ。

84 名前:デフォルトの名無しさん :2006/03/19(日) 01:45:06
>>82
auto_ptrのパフォーマンスを論じてんのが極論なんだろ。

85 名前:デフォルトの名無しさん :2006/03/19(日) 01:54:24
>>81
ライブラリが必要なんですね。

とりあえずコピペで行きます。。

86 名前:デフォルトの名無しさん :2006/03/19(日) 01:56:49
だから適当なコード書いて実測しろと
話はそれからだ

87 名前:デフォルトの名無しさん :2006/03/19(日) 02:00:38
実測値とか依存になりえるもの全てに依存した数値だから困る
てかパフォーマンス以外にもautoptr使いたく無い場面ってあるある

88 名前:デフォルトの名無しさん :2006/03/19(日) 02:01:54
日本語が酷い事になってるが突っ込みは無しで

89 名前:デフォルトの名無しさん :2006/03/19(日) 02:04:48
使えない(vectorの要素とか)場合なら分かるけど
使いたくないって・・どんなんやねん?

90 名前:デフォルトの名無しさん :2006/03/19(日) 02:06:31
>>87
そんな微妙な最適化などすべきじゃないだろう。

ソースコードを最適化して、
アセンブラレベルで見たら、加算命令がひとつ消えていました。
最適化は成功したようです。

これは違うだろ?



91 名前:70 :2006/03/19(日) 02:10:38
>82
直後の2行は無視ですか。そうですか。

auto_ptrて、標準C++ライブラリでもかなりオーバーヘッドの少ないクラスだよね?
そのオーバーヘッドが気になるなんて、どういうデータ構造にしているんだろう?
プログラムの大半がポインタアクセスになるようなプログラムでもないかぎり、
そんなにひどいことにはならんと思うけど……
#流体シミュレーションとか有限要素解析とか、そっち系かな?


92 名前:デフォルトの名無しさん :2006/03/19(日) 02:15:15
スマートポインタの速度比較
http://hp.vector.co.jp/authors/VA022575/c/e/smtptr2.html
http://boost.cppll.jp/HEAD/libs/smart_ptr/smarttests.htm

93 名前:デフォルトの名無しさん :2006/03/19(日) 02:16:09
>>89
まぁ確かにautoptrの挙動で困る場面ならautoptr使えないようになってるけどな。

94 名前:デフォルトの名無しさん :2006/03/19(日) 02:19:16
使わなくて済むんなら使わなくていいんじゃないか?
C++にはいろいろな選択肢がある、というだけだし

95 名前:デフォルトの名無しさん :2006/03/19(日) 02:20:57
>>91
標準C++ライブラリと比較してオーバーヘッドを語られてもなぁ。
そんな話は意味ないだろ。

96 名前:デフォルトの名無しさん :2006/03/19(日) 02:32:22
>#流体シミュレーションとか有限要素解析とか、そっち系かな?
そっち系なら、生ポインタ推奨なのかな
特殊用途だとは思うけど

97 名前:デフォルトの名無しさん :2006/03/19(日) 02:33:45
スマートポインタのパフォーマンス気にしないなら、JavaいけJava

98 名前:デフォルトの名無しさん :2006/03/19(日) 02:34:34
いやDやろうぜ
業務には使えないが

99 名前:デフォルトの名無しさん :2006/03/19(日) 02:36:10
もういいから好きなの使いなよ

100 名前:70 :2006/03/19(日) 02:46:09
>95
auto_ptrのオーバーヘッドがどの程度か示さずに語られてもなぁ。
そんな話は意味ないだろ。

>96
でしょうね。普通、データ数が物凄いことになるから、データにアクセスするときの
オーバーヘッドがバカにならない……
チューニングの最後の方には変わりないけど、そこまで踏み込まなきゃいけない
ことが多々あるようですね。


101 名前:デフォルトの名無しさん :2006/03/19(日) 02:57:25
auto_ptr のどこにオーバーヘッドがあると思ってるんだ?
http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/memory-source.html

102 名前:デフォルトの名無しさん :2006/03/19(日) 07:03:49
>>100
auto_ptrなんて、生のポインタを使うのとまったく同じなわけだが。
まさか今日び、テンプレートをサポートしていながら、
インライン展開をサポートしていないコンパイラも珍しい。

103 名前:デフォルトの名無しさん :2006/03/19(日) 07:23:32
インライン展開されると不具合が出るコードktkr

104 名前:70 :2006/03/19(日) 12:36:24
ああ、そりゃそうか。
ポインタ自体のオーバーヘッド(ポインタごしのアクセス / 直接アクセスの違い)と
ごっちゃにしていたよ。

auto_ptrとしてのオーバーヘッドはポインタのコピー(移動)ぐらいか。


105 名前:デフォルトの名無しさん :2006/03/19(日) 12:50:54
テンプレートを使うデメリットは、コードサイズの増加?

106 名前:デフォルトの名無しさん :2006/03/19(日) 12:57:09
コードサイズの増加は、手書きでも同じようにコーディングしたらあんまり
変わんないんじゃない?

どっちかというと、テンプレートの欠点は
・コンパイル時間の増加
・(externを実装したものが少ないので)ヘッダーに実装詳細まで
 含まれるのでゴチャゴチャする
のような気がする

107 名前:デフォルトの名無しさん :2006/03/19(日) 13:23:18
確かにヘッダに実装書くのきもちわるい

108 名前:デフォルトの名無しさん :2006/03/19(日) 13:35:16
>>100

鸚鵡返しは、低能の証だと何度言ったらわかるんだ?


109 名前:70 :2006/03/19(日) 13:50:15
いや、コメント考えるのタルかったんで。何度も言われた記憶ないし。
で、auto_ptrのオーバーヘッドってなに?


110 名前:デフォルトの名無しさん :2006/03/19(日) 13:59:38
>>109

馬鹿


111 名前:デフォルトの名無しさん :2006/03/19(日) 14:01:23
>>110
禿同。あれをsmart_ptrと名付けなかった連中を誉めたい。

112 名前:70 :2006/03/19(日) 14:11:56
内容の無いコメントするのも無能の証だとおもうけど?

auto_ptrはauto_ptrでsmartだと思うけどね。
あれのおかげでRAIIとか所有権の明確化/移動がやりやすい。
確かに気を付けないと大怪我するけど、それは「C++だから」ということで。


113 名前:デフォルトの名無しさん :2006/03/19(日) 16:37:20
数字コテ化するのは煽りあいが泥沼化してる証だぜ

114 名前:デフォルトの名無しさん :2006/03/19(日) 19:09:58
STLのは、auto_ptrでいいと思うけどね。
smartっていうなら、boostのshared_ptr見たいなやつだろう。
こっちは、確かにオーバーヘッドがあるけど、目的が違うしね。

115 名前:デフォルトの名無しさん :2006/03/19(日) 19:35:33
もう、70は感情にまかせて書いてるだけか。


116 名前:デフォルトの名無しさん :2006/03/19(日) 19:57:53
俺が令状だ

117 名前:デフォルトの名無しさん :2006/03/19(日) 20:06:22
話をぶった切ってすみません、質問させてください。
template <template <int> class apply, int n>
struct applier { 
  enum { value = apply<n>::value }; };
template <int n> struct add {
  template <int m> struct result { 
    enum { value = n + m }; }; };
template <int n, int m>
struct applier_add { 
  enum { value = applier<add<n>::result, m >::value }; };
int main() { std::cout << applier_add<2,3>::value << std::endl; }
これが VS.net のコンパイルできて g++ 3.4.4 でコンパイルできないのは何ででしょうか?
また、これを g++ でコンパイルできるようにするにはどうしたらよいでしょうか?

g++で出るコンパイルエラーは↓です
main.cpp:11: error: type/value mismatch at argument 1 in template parameter list
for `template<template<int <anonymous> > class apply, int n> struct applier'
main.cpp:11: error: expected a class template, got ` add<n>::result'

118 名前:デフォルトの名無しさん :2006/03/19(日) 20:10:53
>>117
add<n>::template result

119 名前:デフォルトの名無しさん :2006/03/19(日) 20:20:15
>これが VS.net のコンパイルできて g++ 3.4.4 でコンパイルできないのは何ででしょうか?
add<n>::resultがテンプレートであることは実体化させてみるまで分からない。
だから、「型でもテンプレートでもないもの」と推定される。
型やテンプレートを期待している場合は、それぞれtypenameとtemplateキーワードが必要。

120 名前:119 :2006/03/19(日) 20:21:21
VS.netでコンパイルできるのは、単にコンパイラが甘いだけ。

121 名前:デフォルトの名無しさん :2006/03/19(日) 20:32:03
>>118
おお!通りました!ありがとうございます。

>>119-120
分かりやすい説明、本当にありがとうございます。助かりました。

122 名前:デフォルトの名無しさん :2006/03/19(日) 23:28:49
ACDK (Artefaktur Component Development Kit)っていうライブラリ使ったことある人いませんか?
このACDKのコアライブラリがJavaっぽいクラスライブラリで、(acdk::lang::StringBufferとか)
なかなか使えるんじゃないかとおもってるんですが。

123 名前:デフォルトの名無しさん :2006/03/20(月) 09:34:29
久しぶりに質問者の意図が全くわからん質問だな

124 名前:デフォルトの名無しさん :2006/03/20(月) 12:56:57
C++使いにはJavaっぽいと言われて良さそうだと思う人は少ないのではないかと思う。

125 名前:デフォルトの名無しさん :2006/03/20(月) 14:23:32
「Javaっぽい」という言葉が好意的に受けいれられるのはJava使いの間だけ!

126 名前:デフォルトの名無しさん :2006/03/20(月) 15:10:34
>>123-125
>C++使いにはJavaっぽいと言われて良さそうだと思う人は少ないのではないかと思う。
それもそうだ。了解です。

127 名前:デフォルトの名無しさん :2006/03/21(火) 03:39:05
まだ、C++初心者なんですが
参照で,アンパサンド 「 & 」 で宣言して
かつ、初期化が必要と知ったのですが
この参照という行為自体
何か、特別な意味合いがあるんでしょうか
学習していくうちに、必要性が出てくるのなら覚えておきたいですが
あまり必要性が無いなら、軽い知識として覚える程度で良いのでしょうか
あと、C言語なら、ポインタなら%pを使ってアドレスがみれて
%xなら16進数等、それぞれの変数に対する表現方法
があるのは自明の理だとおもいますが、C++では、また別の
構文が有るのでしょうか、初心者なので、屁みたいな質問かもしれませんが
できれば教えて頂きたいです

128 名前:デフォルトの名無しさん :2006/03/21(火) 04:05:12
参照を使うべきか、ポインタを使うべきかは、適材適所。両方同程度に使えるようにしておいた方がいい。

ポインタと参照で、おそらく一番違う点は、参照は「常にオブジェクトを指している」ことだ。
この制限があるので、より安全に使えることが期待できる。

int i = 1; // 整数型
int* ptr = &i; // 整数型へのポインタの初期化
int& ref = i; // 整数型への参照の初期化

*ptr = 2; // ポインタを介したアクセス
ref = 3; // 参照を介したアクセス

int* qtr; // qtrの指す先は不定
qtr = 0; // qtrはオブジェクトを指さない(ぬるぽ)
int& ref2; // エラー。参照先が指定されていない
int& ref3 = 0; // エラー。何も指さない参照は許されない
int& ref4 = *qtr; // 酷い例

上記例のように、参照の場合、初期化やアクセスの際に*や&などの記号がつかない。
参照元の完全な別名として扱うことができ、コードがすっきりする。

また、C++では関数は値渡しがデフォルトだが、効率の観点で関数呼び出し時にコピーを作りたくないことがある。
この場合、定数参照渡しが「非常に良く」登場する。
void func(const int& ref) { return ref*2; }

後半の構文云々はprintfの書式指定子のことかな?
出力ストリームへの書式指定は、C++ではマニピュレータを使う。
cout << setw(3) << hex << 25 << endl;

129 名前:デフォルトの名無しさん :2006/03/21(火) 06:59:47
C++なんかいらない、Cだけで十分
そう思っていた時期が俺にもありました

130 名前:デフォルトの名無しさん :2006/03/21(火) 07:10:05
ボクシングには蹴り技がある
そう思っていた時期が俺にもありました

131 名前:デフォルトの名無しさん :2006/03/21(火) 07:31:11
禿は自分の基本方針として「新機能をやたら増やしてユーザを喜ばす、ようなことは避けたい」と言っている
にもかかわらず、参照が TCPL の初版からあったのは "強い理由" があったからに他ならない

132 名前:デフォルトの名無しさん :2006/03/21(火) 08:38:24
newで確保してファイルから特定の文字列を可変長読み込むみたいなのを作ろうと思うんだけど
C++には動的配列拡張するCのreallocに対応する関数ってある?

133 名前:デフォルトの名無しさん :2006/03/21(火) 08:48:29
>>132
new で確保した領域を拡張する操作は無い。
かわりに std::vector を使うのが正解。

134 名前:デフォルトの名無しさん :2006/03/21(火) 08:55:28
struct C {
int x;
struct Y {
int y1, y2;
} y;
int z;
};
こういう構造体があるとき、C *p; に対して
printf("%d\n", p->x);
printf("%d\n", p->y.y1);
printf("%d\n", p->y.y2);
printf("%d\n", p->z);
を for 文で書けないでしょうか?

135 名前:デフォルトの名無しさん :2006/03/21(火) 09:03:03
>>134
いちおう書けるよ。余計なものがいっぱい付いてくるけど。

136 名前:デフォルトの名無しさん :2006/03/21(火) 09:04:47
余計なものって何さ

137 名前:135 :2006/03/21(火) 09:05:37
つまり、止めとけってことね。元のソースで何が不満なのさ?

138 名前:デフォルトの名無しさん :2006/03/21(火) 09:14:53
>>136
size_t const offset_to_int[4] とか、
boost::function<int& (C&)> int_by_index[4] とか。

offsetof(C, y.y1) って有効だっけ?直接のメンバしかだめ?

139 名前:デフォルトの名無しさん :2006/03/21(火) 09:21:49
>>137
実際はメンバがもっと多くて処理も複数行に渡ってる、つまり
DoSomething1(p->Member1);
DoSomething2(p->Member1);
DoSomething1(p->Member2.SubMember1);
DoSomething2(p->Member2.SubMember1);
DoSomething1(p->Member2.SubMember2);
DoSomething2(p->Member2.SubMember2);
DoSomething1(p->Member3);
DoSomething2(p->Member3);
// ... まだまだ続く
みたいになっていて、一見しただけでは処理したいもの全部に
対して本当に処理しているのが分からないからです。これが例えば
int table[] = {C::Member1,C::Member2::SubMember1,C::Member2::SubMember2,...};
for (int i = 0; i < n; ++i) {
DoSometiong1(p.table[i]);
DoSometiong2(p.table[i]);
}
みたいに書ければ見通しがよくなるのですが。

140 名前:デフォルトの名無しさん :2006/03/21(火) 09:30:26
>>139
よしわかった。
じゃぁまずは offsetof 使ったやつを。
C が POD 限定になるうえに offsetof(C, y.y1) が怪しいが、
とりあえず >>134 の C についてコンパイルと実行はできた。

void print(C* p)
{
  static size_t const offset_to_int[4] = {
    offsetof(C, x),
    offsetof(C, y.y1),
    offsetof(C, y.y2),
    offsetof(C, z),
  };
  for(int i = 0; i < 4; ++i)
  {
    printf("%d\n", *reinterpret_cast<int*>(reinterpret_cast<char*>(p) + offset_to_int[i]));
  }
}

141 名前:デフォルトの名無しさん :2006/03/21(火) 09:36:52
こちらのスレへ
http://pc8.2ch.net/test/read.cgi/tech/1142741989/

142 名前:デフォルトの名無しさん :2006/03/21(火) 09:48:42
offsetof(C, y.y1) は offsetof(C, y) + offsetof(C::Y, y1) とすれば問題ない。

143 名前:デフォルトの名無しさん :2006/03/21(火) 10:03:33
無駄にBoost.Lambdaを使ってみる。
#include <iostream>
#include <boost/function.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/casts.hpp>
struct C {
int x;
    struct Y {
        int y1, y2;
    } y;
    int z;
};
int main()
{
    C c = {
        1,
        {2, 3},
        4
    };
    using boost::lambda::bind;
    using boost::lambda::_1;
    boost::function<int (const C&)> arr[] = {
        bind(&C::x, _1),
        bind(&C::Y::y1, bind(&C::y, _1)),
        bind(&C::Y::y2, bind(&C::y, _1)),
        bind(&C::z, _1),
    };
    for (int i = 0; i < 4; ++i)
        std::cout << arr[i](c) << std::endl;
    return 0;
}

144 名前:デフォルトの名無しさん :2006/03/21(火) 10:05:52
CがPODなら共用体を使うという手も使えるだろう。

union Hoge
{
    C Foo;
    int Bar[4]
};

145 名前:デフォルトの名無しさん :2006/03/21(火) 10:08:46
>>143
これを >>140 に最適化してくれるコンパイラがあれば神なんだが。

と思ってとりあえず iostream を cstdio に置き換えてから
gcc にアセンブリ吐かせてみたが、悶絶した。駄目だ。

146 名前:デフォルトの名無しさん :2006/03/21(火) 10:11:38
>>144
Hoge x に対して &x.Bar[1] == &x.Foo.y.y1 が成り立つと証明できる?
構造体のほうにはパディングが入る可能性があるからダメだと思うんだけど。

147 名前:デフォルトの名無しさん :2006/03/21(火) 10:15:22
アライメントを調整すればいいだけだろ

148 名前:デフォルトの名無しさん :2006/03/21(火) 10:26:58
そんなキモイコードは書きたくない。


149 名前:デフォルトの名無しさん :2006/03/21(火) 10:30:36
>>139
メンバー関数用意しろ。



150 名前:デフォルトの名無しさん :2006/03/21(火) 10:50:19
doxygenに食わせたら、構造体のメンバ一覧がperlで出るから、
それ使ってコード生成したら?

151 名前:デフォルトの名無しさん :2006/03/21(火) 10:53:26
巡回用のイテレータを作れば?
そうすりゃalgorithmも適用できるから2重にお得

#include<iostream>
struct C { 
    int x;struct Y {int y1, y2;} y;int z;
    struct iterator{
        C*c;int&(**pos)(C*);
        explicit iterator(C*c,int&(**pos)(C*)):c(c),pos(pos){}
        int&operator*(){return (*pos)(c);}iterator&operator++(){++pos;return*this;}
        friend bool operator!=(iterator a,iterator b){return a.c!=b.c||a.pos!=b.pos;}
    };
    iterator begin();
    iterator end();
}; 
namespace{int&Cx(C*c){return c->x;}int&Cy1(C*c){return c->y.y1;}
int&Cy2(C*c){return c->y.y2;}int&Cz(C*c){return c->z;}
int&(*table[])(C*)={Cx,Cy1,Cy2,Cz};}
C::iterator C::begin(){return C::iterator(this,table);}
C::iterator C::end(){return C::iterator(this,table+sizeof(table)/sizeof(table[0]));}
int main() 

    C c = {1,{2, 3},4 };
    C::iterator it = c.begin(),end=c.end();
    //for_each + ostream_iteratorでも可
    for (;it != end;++it) 
        std::cout << *it << std::endl; 
    return 0; 


152 名前:デフォルトの名無しさん :2006/03/21(火) 11:10:15
最近constのメリットがあんま見出せない気がするんだが・・
すでにビット的定数性のないクラスなんていくつも出てきたし、
スレッドセーフとか言うわけでもないし、なんのためにがんば
ってconstつけてんだかわかんねー。
唯一、
void f(const string& s)
とかで
operator動かせて、f("hoge")って呼べるくらいしか
思いつかない。






153 名前:デフォルトの名無しさん :2006/03/21(火) 11:23:12
>>152
うっかり書き換えてしまうのを防ぐことができるじゃないか。

いつの間にか const スレが落ちてるのに気づいた。

154 名前:デフォルトの名無しさん :2006/03/21(火) 11:26:14
>>152
void f(const string &s);
だと、
f(s);
としたときに、sの値が変わらないことが保証される。
「値が変わらない」の正確な意味は型によるけど、
たとえ内部表現が変わっても観測可能な振舞は変わらないように
const性が定義されてることを期待できる。
これで十分じゃないか?

155 名前:デフォルトの名無しさん :2006/03/21(火) 11:29:55
いやあ、まあそれはそうなんだがさ、それだけのためにちょっと
手間がかかりすぎる気がするなあと。
stlもconst_iteratorとかさ・・。もう疲れたよ。
全てつけるのやめるとすると、上の以外なんか問題ってあるん
だったっけ?

156 名前:デフォルトの名無しさん :2006/03/21(火) 11:36:31
>>155
静的な定数テーブルがプロセス間で共有できない。
または ROM に配置できない。

157 名前:デフォルトの名無しさん :2006/03/21(火) 11:37:34
>>153
constスレとカンマスレを偲ぶ人多いね。
良スレだったってことですね。

158 名前:デフォルトの名無しさん :2006/03/21(火) 11:43:44
>154
ほら、保障っつってもさ、const_cast程度で外されちゃうし、
大した保障じゃないなら、もう
void f(string &s);
でいいんじゃないのかなーとか思うんだよね。そうするとさ、
void getHoge() const{}
これは意味的定数性だからconstにして、メンバはmutableつけて
対策してと・・とか色々考えるのから開放されるしさ。
そもそもきっとconst導入した人は、ビット的定数性なんて問題を
想定してなかったような気がするし、そうするともう役目を終えてる
というか、なんかほとんど効力がない機能のような気がするんだよなあ。


159 名前:デフォルトの名無しさん :2006/03/21(火) 11:52:25
んじゃconstは気が向いた時に付ければいいってことで

160 名前:デフォルトの名無しさん :2006/03/21(火) 11:56:51
>>158-159 >>156

161 名前:デフォルトの名無しさん :2006/03/21(火) 12:00:43
ま、愚痴ってもしょうがないか

162 名前:デフォルトの名無しさん :2006/03/21(火) 12:35:25
>>152
値セマンティクスのクラスにはconstをしっかり考えてやるべきだけど、
参照セマンティクスのクラスはあまりconstを考える必要はない。

というのをどこかで読んだ覚えがある。

163 名前:デフォルトの名無しさん :2006/03/21(火) 14:28:47
>>149
>>151
C は自分で作ったクラスではないので、いじらずに済ませたいのです。
Interface Pattern はアリですが、もっとシンプルなのが無いかと思いまして。

>>150
C++ の範囲内でやる方法は無いですかねえ。

164 名前:デフォルトの名無しさん :2006/03/21(火) 14:38:23
>>163 140,143 は無視か?

165 名前:デフォルトの名無しさん :2006/03/21(火) 18:38:02
>158
>const_cast程度
程度じゃねえよ、const_castは実装のための最後の手段の1つで、
そうホイホイ使うような物じゃないだろ。

constは単純なread onlyインターフェイスを生成する手段の一つだと思ってる。
read onlyインターフェイスが要らないクラスなら、無くてもいいんじゃね。

166 名前:デフォルトの名無しさん :2006/03/21(火) 19:06:12
const_cast とタイプすると罪悪感に苛まれるな

167 名前:デフォルトの名無しさん :2006/03/21(火) 19:16:39
俺のやっていたことはすべて間違っていたのか?
と、途方にくれるな

168 名前:デフォルトの名無しさん :2006/03/21(火) 20:24:55
今のところ、幸いにもこういう風にしかconst_castは使ったことが無い。
class Hoge
{
public:
const_reference operator [](std::size_t i) const {/* 〜 */}
refernece operator [](std::size_t i) {return const_cast<reference>(static_cast<const Hoge&>(*this)[i]);}
};

169 名前:デフォルトの名無しさん :2006/03/21(火) 21:49:36
>>168
こっちのがよくね?
reference operator [](std::size_t i);
const_reference operator [](std::size_t i) const {return const_cast<Hoge&>(*this)[i];}

170 名前:デフォルトの名無しさん :2006/03/22(水) 00:14:24
int a[MAX] などと配列のメンバーを持つクラスにおいて、
コンストラクタで、メンバーイニシャライザで初期化するには
どうすればよいでしょうか?

171 名前:デフォルトの名無しさん :2006/03/22(水) 00:16:17
>>170
できません。

172 名前:デフォルトの名無しさん :2006/03/22(水) 00:17:10
ということは、コンストラクタの実装で、for で回す等して初期化するしかない
んですね。ありがとうございました。

173 名前:デフォルトの名無しさん :2006/03/22(水) 00:50:14
>158
ちょっと、言い方がおかしかったかも。
constの価値がないと言ってるんじゃなくて、概念的定数性の存在価値は
あるのかってことを言いたかった。
Java的に言うとimmutableパターンによるスレッドセーフなオブジェクトと
シャローコピー時のデータ汚染の回避みたいなメリットが、概念的定数性
だとmutableによって、当然どっちも失われるわけだから、苦労する意味は
いったいあるのか?みたいなことを言いたかった。

174 名前:デフォルトの名無しさん :2006/03/22(水) 01:14:34
int foo() {
bar();
{
 static int si = 123;
  return si;
}
}
みたいなC++の関数があるとして、si用のメモリが123に初期化されるのは
どのタイミングでしょうか?

1 プログラムが実行開始した瞬間
2 main関数到達前
3 foo関数初回呼び出し直後
4 変数siの存在するブロックに初回に入ろうとする時

くらいの候補があると思うのですが。手持ちのコンパイラでは1でしたが、
標準で保障されているのがどこまでかが知りたいです。


175 名前:デフォルトの名無しさん :2006/03/22(水) 01:17:00
>>173
その言い方だと mutable さえ使わなければ挙げてるメリットが得られるんだろ?
十分だと思うなぁ。
なんで mutable の使用が前提になってんの?

176 名前:デフォルトの名無しさん :2006/03/22(水) 01:24:29
標準仕様じゃ決まってないだろ。
大抵はデータセグメントに配置されて、プログラムロード時に初期値が設定されるんじゃねーの?



177 名前:デフォルトの名無しさん :2006/03/22(水) 01:26:41
>>174
POD 型のローカル static オブジェクトが定数式で初期化される場合、
プログラムが初めてブロックに入る前に初期化されていればいつでもいい。

6.7 -4-
ttp://www.kuzbass.ru/docs/isocpp/stmt.html#stmt.dcl

178 名前:174 :2006/03/22(水) 01:32:41
>176,177
ども。クロスプラットフォームなコードを書いている関係で、「PODなロー
カルstaticオブジェクトの定数式による初期化」がスレッドセーフに行わ
れるかどうかを気にしているのですが、スレッドが絡むと標準仕様では何
ともいえないですかね・・・。

179 名前:デフォルトの名無しさん :2006/03/22(水) 01:54:22
>>178
大丈夫、どのスレッドかは兎も角、どれかのスレッドで最初に実行されるまでには
初期化されている。
まぁ、volatileつけないとどの道まともに扱えないわけだが。

180 名前:デフォルトの名無しさん :2006/03/22(水) 01:56:04
>>178
GCC 4.0 の変更点 http://gcc.gnu.org/gcc-4.0/changes.html に挙げられていた
リンクからたどった、関係ありそうな記事へのリンクを貼っておく。
http://www.codesourcery.com/cxx-abi/cxx-closed.html#G4
あんまりしっかり読んでないけど、とりあえず
いろいろがんばってる人たちが居るのはわかった。

「POD なローカル static オブジェクトの定数式による初期化」に限れば、
わざわざ初期化を遅らせるメリットも無いと思うんで、おおかたの実装で
グローバルなのといっしょにまとめて初期化されるだろうね。

ところでクロスプラットフォームでスレッドを扱うなら、使ってるスレッドライブラリに
ここらへんの問題に対処する道具があったりしないかな?

181 名前:デフォルトの名無しさん :2006/03/22(水) 02:04:36
>>179
いや、何の前提も加えずに大丈夫とは言えないだろう。
現行の規格ではスレッドについて何の言及も無いわけで、
規格に準拠したコンパイラがスレッドを考慮したコード生成を行うとは限らない。

182 名前:デフォルトの名無しさん :2006/03/22(水) 02:12:18
>179
そうだっけ?
確か大抵の実装は関数に入る際にフラグをチェックして
初回ならば、コンストラタを呼び・・みたいに展開されるので
マルチスレッドの場合はコンストラクタが2度呼び出されるので
危険だったような・・
だとすればPODの場合もアウトなので、その関数はまずシングル
スレッドで一度呼び出されていないとまずくなると想定していて、
俺は怖いのでそうしてる。

183 名前:182 :2006/03/22(水) 02:20:06
いや、ごめん、実装依存か?
http://gcc.gnu.org/gcc-4.0/changes.html
The compiler now uses the library interface specified by the
C++ ABI for thread-safe initialization of function-scope static
variables. Most users should leave this alone, but embedded
programmers may want to disable this by specifying -fno-threadsafe-
statics for a small savings in code size.

gcc4.0はfunction-scope staticはthread-safeを保障しているみたい
VCはどうかな

184 名前:182 :2006/03/22(水) 02:36:28
>175
概念的定数性ってメンバにキャッシュ処理的なことしてる場合に
GetHoge()とかがメンバを変えるけど、意味的にはconstって
ことだろ?
class A{public:
void GetHoge() const{a_ *= 2; return a_;}
mutable int a_;
};
でも、constにしたいからメンバをmutableにするって理解
だったが・・、なんか違うかな?
んで、結局GetHogeはスレッドセーフじゃないし、immutable
オブジェクトにもならないからメリットはなんだ?という
ことを考えたが。

185 名前:デフォルトの名無しさん :2006/03/22(水) 03:00:39
>>184
mutable を使えばそうなる。あたりまえ。
それは const の機能について「ほとんど効力がない」という理由にはならないだろ。

結局は、キャッシュや遅延評価を装備したオブジェクトから値を取り出す
メンバ関数に const 付けて mutable 使うか、非 const メンバ関数にしてしまうか
という2択で迷ってるだけじゃないの?

186 名前:デフォルトの名無しさん :2006/03/22(水) 04:29:01
>185
>それは const の機能について「ほとんど効力がない」という理由には
>ならないだろ。
いや、だからそれは173で訂正してると思う・・

> 結局は、キャッシュや遅延評価を装備したオブジェクトから値を取り出す
> メンバ関数に const 付けて mutable 使うか、非 const メンバ関数にしてしまうか
> という2択で迷ってるだけじゃないの?
Yes。けど、"ただ"と言えるほど簡単な話ではないと思う。(EffectiveC++
で筆者は両者の方法は哲学的問題と言ってるが)。そして、今のところ自他
ともスマートな解決方法は聞いたことがない。
185はどっちの立場でやってる?

187 名前:デフォルトの名無しさん :2006/03/22(水) 04:32:27
"ただ"→"だけ"

188 名前:デフォルトの名無しさん :2006/03/22(水) 05:10:02
constスレとカンマスレってどこにあるの?

189 名前:デフォルトの名無しさん :2006/03/22(水) 06:14:22
>188
多分,下の2つのスレのことかと思われ.いずれも dat 落ち.

【C++】 const だけでメシが3杯食えちゃうスレ
http://pc8.2ch.net/test/read.cgi/tech/1078193971/

【C】カンマ演算子を極めるスレ【C++】
http://pc8.2ch.net/test/read.cgi/tech/1112011590/

190 名前:デフォルトの名無しさん :2006/03/22(水) 07:21:33
>>179
>まぁ、volatileつけないとどの道まともに扱えないわけだが。
kwsk



191 名前:174 :2006/03/22(水) 07:45:15
どもです。最近のg++なら(PODでなくても)スレッドセーフに初期化される
ので問題ないですね。しかし、MS/Sun/HP/Intel/..のコンパイラだとどうな
の?というのが気になっている&コンパイラ買えないという感じです。
local staticは諦めて、

static int si = 123;
int foo() {
 bar();
 return si;
}

にすればOKでしょうか。


192 名前:デフォルトの名無しさん :2006/03/22(水) 07:51:00
>>191 中だろうが外だろうが実装依存。

193 名前:174 :2006/03/22(水) 08:02:43
>192
http://www.kuzbass.ru/docs/isocpp/basic.html#basic.start.init
を見るに外なら"static initialization"が行われるそうですが、
ほんとに実装依存?

194 名前:デフォルトの名無しさん :2006/03/22(水) 09:18:28
>>178
関数オブジェクトに汁

195 名前:174 :2006/03/22(水) 09:26:19
>194
すみません、もうちょい具体的に・・・

196 名前:デフォルトの名無しさん :2006/03/22(水) 09:29:22
>>189ありがd

197 名前:デフォルトの名無しさん :2006/03/22(水) 09:56:18
>>195
http://www.google.co.jp/search?hl=ja&q=%22%E9%96%A2%E6%95%B0%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%22&lr=

198 名前:デフォルトの名無しさん :2006/03/22(水) 09:59:30
しつもんです、簡潔に
template <typename A,typename B>inline char *binary_pack(const std::map<A,B> &src,char *from)
{
 *((int*)from)=(int)src.size();
 from+=4;
 for(std::map<A,B>::const_iterator i=src.begin();i!=src.end();i++)
  from=binary_pack(*i,from);
 return from;
}
という関数を作ったのですがg++(gcc3.4.4/FC4)で通らなくて困ってます。
エラー内容はiteratorのiが定義されてないということらしいのですが、
VC++7やgcc3.2.4あたりでは通ったり(警告でる)します。
同じ関数名でいくつか似たような機能のものを複数多重定義してますが、
mapでないvectorのiterator作ろうとしてもエラーでてしまいます。
-fno-implicit-templatesのようなオプションも無駄でした
http://www.sra.co.jp/wingnut/gcc/gcc-j.html#Invoking%20GCCより。

たぶんiteratorの定義方法が正確ではないのかなと思ってるんですが
エラーの対処方法詳しくわかる方居たらご教授願えないでしょうか?


199 名前:デフォルトの名無しさん :2006/03/22(水) 10:05:12
typename std::map<A,B>::const_iterator
かな

200 名前:198 :2006/03/22(水) 10:10:32
ありがとうございます!
typenameつけたらwarningもでなくなり通るようになりました。


201 名前:デフォルトの名無しさん :2006/03/22(水) 10:10:41
>>198
本当にコンパイル通ったのか?
再帰の実引数 *i は map の const_iterator が指し示す先で
再帰の仮引数 src は map そのものへの参照やんけ

202 名前:デフォルトの名無しさん :2006/03/22(水) 10:22:05
そうじゃなくて、関数オブジェクトとスレッドセーフティの関係が知りたいってことだろ >>197



203 名前:デフォルトの名無しさん :2006/03/22(水) 10:33:43
>>201
多重定義だろ。

204 名前:デフォルトの名無しさん :2006/03/22(水) 10:54:35
STLportの便乗話だけど、VC7.1のビルドは特に何もしないで出来たが、
VC8のビルドは、configure.batを走らせてからでないとビルド出来ない。

多分もう誰でも知ってると思うけど、一応初心者用に書いておきます。

205 名前:デフォルトの名無しさん :2006/03/22(水) 10:54:56
誤爆シマスタ

206 名前:185 :2006/03/22(水) 12:36:58
>>186
> いや、だからそれは173で訂正してると思う・・
ごめん。見落としてた。

よく考えると、概念的 const のせいで苦労が増すというのがおかしいと思う。

スレッドセーフが必要なら、どのみち値の算出(〜設定)に同期が要る。
クラスが内部でやらなければ利用者に責任が押し付けられることになる。

シャローコピーしたところで概念的に const でさえあればデータ汚染にはならない。
>>184 の例がまずいのは、繰り返し GetHoge() を呼び出すだけで値が変わっていくから。
一般的なキャッシュ、遅延評価の実装では他の非 const 操作が行われるまで
外部に返される値は変わらない。この場合、他に非 const 操作がなければ
Immutable オブジェクトとしての性質を満たし得るだろう。

先にインターフェースを考えて、実装段階でキャッシュが必要になることを考えると、
immutable を使った概念的 const も妥当だと思う。

207 名前:デフォルトの名無しさん :2006/03/22(水) 15:10:38
そろそろ標準でスレッドをサポートしてほしいな。

208 名前:デフォルトの名無しさん :2006/03/22(水) 15:20:22
重くなるからいらない
今の定義で十分に対応可能だし

209 名前:デフォルトの名無しさん :2006/03/22(水) 15:21:34
スレッドは一生無理でしょ
禿もそういってるし

210 名前:デフォルトの名無しさん :2006/03/22(水) 15:31:52
C++自体が多重仮想記憶を「サポートする」機能を持たないのと同じ

211 名前:デフォルトの名無しさん :2006/03/22(水) 19:01:38
マルチスレッドに対する挙動を仕様で決めてくれれば十分

212 名前:デフォルトの名無しさん :2006/03/22(水) 20:22:27
sizeofに詳しいサイト求む

213 名前:デフォルトの名無しさん :2006/03/22(水) 21:44:54
BCC5.6.4でこれをコンパイルすると、cが未定義だと怒られてしまいました。
共用体なので問題ないと思っていたのですが、何が問題なのでしょうか。


#include <iostream>
using namespace std;
union bits{
    bits(double n);
    void show_bits();
    double d;
    unsigned char c[sizeof(double)];
};
bits::bits(double n){
    d = n;
}
void show_bits(){
    int i, j;
    for(j = sizeof(double) - 1; j >= 0; j--){
        cout << "ビットパターン/Byte" << j << ": ";
        for(i = 128; i; i >>= 1)
            cout << i & c[j] ? "1" : "0";
        cout << endl;
    }
}
int main(){
    bits ob(1991.829);
    ob.show_bits();
    return 0;
}

214 名前:デフォルトの名無しさん :2006/03/22(水) 22:03:15
>>213
なんでshowのほうにbits::ねえんだよ
あとi&c[j]は括弧でくくれ、優先順位が違う

215 名前:デフォルトの名無しさん :2006/03/22(水) 22:11:38
>>214
すごい単純ミスですいません。
ありがとうございました。

216 名前:デフォルトの名無しさん :2006/03/22(水) 22:17:44
>207
boostじゃだめなの?

217 名前:デフォルトの名無しさん :2006/03/23(木) 02:30:02
volatile つけるとどういう効果があるんでしょうか?

218 名前:デフォルトの名無しさん :2006/03/23(木) 02:32:06
>>217
変数への読み書きが「副作用」とみなされ、最適化で削除されなくなる。
また、 const と同様にオーバーロードに使われる。

219 名前:デフォルトの名無しさん :2006/03/23(木) 02:37:42
>>217
ちなみに所謂cv修飾のvなのでconstがつけれるとこならどこにでもつけれる。

# c は const

220 名前:デフォルトの名無しさん :2006/03/23(木) 02:42:14
最適化で削除されたくない→volatileつける
と考えると、実際どういう場合につけるべきなのか
難しいですね。一時変数は別に不要だとわかりますが
クラスのメンバー変数は全部つけないといけなくなるのかな

221 名前:デフォルトの名無しさん :2006/03/23(木) 03:04:13
>>220
コードから見ていつ変わるかわからん変数やオブジェクトにつけるべし。

具体例をあげると複数のスレッドから変更される変数やオブジェクトとか
メモリマップドI/Oなんかに対してつける。こういった変数やオブジェクトに
アクセスする時に最適化が効いてるととんでもないことになる。

大変なことになる一例をあげると下のコードで hoge をどっかスレッドがfalseにしても
最適化が効いちゃってると無限ループになっちまう。これを避ける為には hoge を volatileで修飾すべし!

bool hoge = true;

void hige() {
 while(hoge);
}

222 名前:デフォルトの名無しさん :2006/03/23(木) 03:36:43
>>220
削除されるのは変数じゃなくて、変数への読み書きだぞ。
メンバー関数に全部つけるとか、ただの糞コードに他ならない。

223 名前:デフォルトの名無しさん :2006/03/23(木) 08:48:56
たとえばWin32のAPIとかconstのはずなのに宣言が
f(void* p);
ってふうになってるケースがあるからこれらを呼び出す時にconstキャストは多々つかいますわ。

224 名前:デフォルトの名無しさん :2006/03/23(木) 08:50:20
>>223
何言ってんの?

225 名前:デフォルトの名無しさん :2006/03/23(木) 09:04:30
ここでエスパー登場。

C 用に設計されたコールバックなどの汎用引数には
ほとんど void* が引数として使われるので、そこに
const T* を渡そうと思ったら const_cast が必要になる。

ってことだと思われ。

226 名前:デフォルトの名無しさん :2006/03/23(木) 10:07:45
>>220
>最適化で削除されたくない
       ^^^^
必ずしも削除じゃないよ
普通に文脈解釈したときの意味が変わるような削除まで無限に許しているわけじゃない
本当に厳密なタイミングが必要な箇所だとか、a -= 0; みたいに意味なさそうに見える箇所だとか、
本来ならアセンブラで書くような性格を含んでいるところに、取扱注意と書いておくだけ

>>222
メンバ関数全部に throw() をつけるたり
非静的メンバ関数全部に virtual をつけたり
基底指定子全部に public をつけたり
C++ ってデフォが糞なの結構あるね

227 名前:デフォルトの名無しさん :2006/03/23(木) 10:12:18
>>226
ではデフォルトで全ての変数をvolatile扱いしてほしいということですか。

228 名前:デフォルトの名無しさん :2006/03/23(木) 10:26:08
>>227
必要な箇所に必要なキーワードを置くことにいやも好きもない
俺はドライに割り切ってるが、糞という表現がでてきたんで言い出したらキリねえぞってだけ

229 名前:デフォルトの名無しさん :2006/03/23(木) 10:51:31
日本語でも勉強するか

230 名前:デフォルトの名無しさん :2006/03/23(木) 11:10:32
えんざんしおーばーろーど

231 名前:デフォルトの名無しさん :2006/03/23(木) 12:34:36
符号付き整数全てにsignedつけたり自動変数全部にautoつけたり

232 名前:デフォルトの名無しさん :2006/03/23(木) 15:24:49
今c++を独習しているのですが、
#include <iostream>
using namespace std;
template <class T>
class coord {
 T x,y;
public:
 coord(T i, T j)  { x=i; y=j; }
 friend ostream &operator<<(ostream &stream, coord ob);
 friend ostream &operator>>(istream &stream, coord &ob);
};
template <class T>
ostream &operator<<(ostream &stream, coord<T> ob)
{
 stream << ob.x << ' ' << ob.y << endl;
 return stream;
}
template <class T>
istream &operator>>(istream &stream, coord<T> &ob)
{
 stream >> ob.x >> ob.y;
 return stream;
}
int main()
{
 coord<int> i_ob(1,2);
 cout << i_ob << endl;
 return 0;
}

こういうコードコンパイルしたら「外部シンボルoperator<< ... が未解決」と怒られました。
どこを訂正すべきでしょうか?

233 名前:デフォルトの名無しさん :2006/03/23(木) 15:37:30
>>232
#include <iostream>
using namespace std;
template <class T> class coord;
template <class T> ostream &operator<<(ostream &, coord<T>);
template <class T> istream &operator>>(istream &, coord<T> &);

template <class T>
class coord {
  T x,y;
public:
  coord(T i, T j) { x=i; y=j; }
  friend ostream &operator<< <T>(ostream &stream, coord ob);
  friend istream &operator>> <T>(istream &stream, coord &ob);
};

234 名前:デフォルトの名無しさん :2006/03/23(木) 15:47:10
>>232
T x,y;
public:
coord(T i, T j) { x=i; y=j; }
- friend ostream &operator<<(ostream &stream, coord ob);
- friend ostream &operator>>(istream &stream, coord &ob);
+ template <typename U> friend ostream &operator<< (ostream &stream, coord <U> ob);
+ template <typename U> friend ostream &operator>> (istream &stream, coord <U> &ob);
};
-template <class T>
-ostream &operator<<(ostream &stream, coord<T> ob)
+template <typename U>
+ostream &operator<<(ostream &stream, coord<U> ob)
{
stream << ob.x << ' ' << ob.y << endl;
return stream;
}
-template <class T>
-istream &operator>>(istream &stream, coord<T> &ob)
+template <typename U>
+istream &operator>>(istream &stream, coord<U> &ob)
{
stream >> ob.x >> ob.y;
return stream;


235 名前:デフォルトの名無しさん :2006/03/23(木) 17:26:23
>>234
メンバテンプレート使うと、BCC5.8.1では「このコンテキストでは<<が
曖昧です」とか言われる。BCCのバグらしい。

gcc3.4.2(MinGW)、VC8ではちゃんと通る。

236 名前:デフォルトの名無しさん :2006/03/23(木) 19:58:46
どっちも一長一短だな

// --- fig1 ---------------------------
template <typename T> struct X {
template <typename U> friend void f(X<U>&)
{
X<int> a;
a.y = 0;
}
private:
int y;
};
main()
{
X<void> x;
f(x);
}
この場合、
・Borland 5.5.1 は private のみを問題視
・g++ 4.1.0 は X<void> で宣言された f と X<int> で宣言された f が曖昧と言ってくる
俺は g++ に賛成


237 名前:デフォルトの名無しさん :2006/03/23(木) 19:59:06
(>>236の続き)

// --- fig2 ---------------------------
template <typename T> struct X {
friend void g(X<T>&)
{
X<int> a;
a.y = 0;
}
};
main()
{
X<void> x;
g(x);
}
この場合、
・Borland 5.5.1 は X<void> で宣言した friend 権限は、X<int> には及ばないと言ってくる
・g++ は何も言ってこない
俺は Borland に賛成

238 名前:デフォルトの名無しさん :2006/03/23(木) 20:11:32
あ、y の宣言忘れてる・・・ でも、わかるよな?w

239 名前:デフォルトの名無しさん :2006/03/23(木) 21:22:47
>どっちも一長一短だな
fig 2の方は何がしたいか分からんのだが。

240 名前:デフォルトの名無しさん :2006/03/24(金) 00:22:11
>221
DQN発見..というのは言い過ぎかもしれないが..痛い。

別のスレッドがその変数に触るなら、mutexなりcritical sectionなり
で排他制御するのが正しい。もしそれを省略してlock-freeなアルゴ
リズムを採用したいのなら、volatileではなくメモリバリアを使え。


241 名前:デフォルトの名無しさん :2006/03/24(金) 00:24:55
メモリバリアとvolatileは用途が違うと思うんだが。
片方はコンパイラ向けで、片方はCPU向けでそ?

242 名前:240 :2006/03/24(金) 00:32:28
メモリバリアは両用だよ。gccの__asm__の最後の引数に"memory"を
渡した場合について調べてみれ。


243 名前:デフォルトの名無しさん :2006/03/24(金) 00:44:59
============== ここまで読んだ ===================


244 名前:デフォルトの名無しさん :2006/03/24(金) 01:31:37
gccの、しかも、__asm__みたいな超特定言語固有な話をされても・・・

245 名前:デフォルトの名無しさん :2006/03/24(金) 01:36:20
>>240
volatile が必要になるようなケースで、volatile を書かずにメモリバリアを入れても駄目でそ。
っていうかメモリバリアってSMPじゃないと意味ないし。volatileはスレッドや割り込み処理でも
有効に使える・・というか正しく使わなくてはならない。

246 名前:デフォルトの名無しさん :2006/03/24(金) 01:40:46
そもそも最適化で消えちゃうのってコンパイラとして問題な希ガス


247 名前:デフォルトの名無しさん :2006/03/24(金) 01:49:01
>>240
DQN発見..というのは言い過ぎかもしれないが..痛い。

mutexなりcritical sectionなりを使ってもvolatileを使わなければ
コンパイラの最適化で無限ループになっても文句は言えない。

248 名前:デフォルトの名無しさん :2006/03/24(金) 02:13:16
>>247
>mutexなりcritical sectionなりを使ってもvolatileを使わなければ
>コンパイラの最適化で無限ループになっても文句は言えない。

え??

249 名前:デフォルトの名無しさん :2006/03/24(金) 02:55:29
>>247
さすがにグローバル変数の場合には volatile なしでも関数呼び出しの前には
値をストアするだろうし、後で参照すれば値をロードしなおすコードが出る出祖。

auuto 変数の場合にはコンパイルオプションによってはロードしなおさないコードが
でることもあるかもしれない。この場合には明示的な volatile が必要か。

250 名前:デフォルトの名無しさん :2006/03/24(金) 08:17:05
またvolatile厨か…



■過去ログ置き場に戻る■ 1- 次250 最新50
DAT2HTML 0.33f Converted.