C++相談室 part95at TECH
C++相談室 part95 - 暇つぶし2ch2:デフォルトの名無しさん
12/05/08 04:58:34.10
■基本■
[C++ FAQ]
 URLリンク(www.parashift.com)
 URLリンク(www.bohyoh.com) (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 URLリンク(en.cppreference.com) (英語)
 URLリンク(ja.cppreference.com) (↑の日本語訳だけどまだ未完)
[Stroustrup]
 URLリンク(www2.research.att.com)
[C++ International Standard]
 URLリンク(www.iso.org)
[JTC1/SC22/WG21 - C++]
 URLリンク(www.open-std.org)
  ここから規格の最新ドラフトがダウンロードできる。
[JIS X3014]
 URLリンク(www.jisc.go.jp)
  ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。

3:デフォルトの名無しさん
12/05/08 05:00:06.89
■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(episteme.wankuma.com) (※1999年発行注意)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)

4:デフォルトの名無しさん
12/05/08 05:02:20.58
■Books■
amazon C,C++関連書籍
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp)

The C++ Programming Language
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Primer (3rd Edition)
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
The C++ Standard Library
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Exceptional C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++ Style
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)

5:デフォルトの名無しさん
12/05/08 05:03:05.30
■Books(Templateまわり)■
Effective STL
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Modern C++ Design
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Templates
 URLリンク(www.amazon.com)
C++ Template Metaprogramming
 URLリンク(www.amazon.com)

6:デフォルトの名無しさん
12/05/08 09:40:19.69
URLリンク(img.2ch.net)
韓国へ、中国の人肉カプセル密輸急増

死産した赤ん坊や乳幼児の遺体からつくられた粉末のカプセルが、
中国から韓国に密輸入されるケースが急増し、韓国関税庁が取締りを強化しています。

 これが摘発された中国製のカプセルです。中には死産した赤ん坊や乳幼児の遺体からつくられた粉末が入っていて、
「滋養強壮剤」として韓国に密輸入されました。韓国では去年8月以降、密輸入が急増しており、
関税庁はこれまでに35件、合わせて1万7000錠以上を摘発しました。いずれも、旅行者の携帯品や国際郵便で持ち込まれたものです。

 色やにおいで識別できないよう生薬などを混ぜたり、他の医薬品の中身だけを入れ替えるなど、
密輸の手口も巧妙になっているということです。

粉末から抗生物質がほとんどきかない「スーパー細菌」が検出されたとして、取締りを強化しています。

(07日17:14)
URLリンク(news.tbs.co.jp)

7:デフォルトの名無しさん
12/05/08 12:29:13.26
        , '´  _. -‐'''"二ニニ=-`ヽ、
      /   /:::::; -‐''"        `ーノ
     /   /:::::/           \
     /    /::::::/          | | |  |
     |   |:::::/ /     |  | | | |  |
      |   |::/ / / |  | ||  | | ,ハ .| ,ハ|
      |   |/ / / /| ,ハノ| /|ノレ,ニ|ル' 
     |   |  | / / レ',二、レ′ ,ィイ|゙/   私は只の数ヲタなんかとは付き合わないわ。
.     |   \ ∠イ  ,イイ|    ,`-' |      頭が良くて数学が出来てかっこいい人。それが必要条件よ。
     |     l^,人|  ` `-'     ゝ  |        さらに Ann.of Math に論文書けば十分条件にもなるわよ。
      |      ` -'\       ー'  人          一番嫌いなのは論文数を増やすためにくだらない論文を書いて
    |        /(l     __/  ヽ、           良い論文の出版を遅らせるお馬鹿な人。
     |       (:::::`‐-、__  |::::`、     ヒニニヽ、         あなたの論文が Ann of Math に accept される確率は?
    |      / `‐-、::::::::::`‐-、::::\   /,ニニ、\            それとも最近は Inv. Math. の方が上かしら?
   |      |::::::::::::::::::|` -、:::::::,ヘ ̄|'、  ヒニ二、 \
.   |      /::::::::::::::::::|::::::::\/:::O`、::\   | '、   \
   |      /:::::::::::::::::::/:::::::::::::::::::::::::::::'、::::\ノ  ヽ、  |
  |      |:::::/:::::::::/:::::::::::::::::::::::::::::::::::'、',::::'、  /:\__/‐、
  |      |/:::::::::::/::::::::::::::::::::::::::::::::::O::| '、::| く::::::::::::: ̄|
   |     /_..-'´ ̄`ー-、:::::::::::::::::::::::::::::::::::|/:/`‐'::\;;;;;;;_|
   |    |/::::::::::::::::::::::\:::::::::::::::::::::::::::::|::/::::|::::/:::::::::::/
    |   /:::::::::::::::::::::::::::::::::|:::::::::::::::::::::O::|::|::::::|:::::::::::::::/

8:デフォルトの名無しさん
12/05/08 14:45:32.75
mapを使って、いちいちinsertせずに一気に初期化したいのですが、下記のコードはエラーになります。
どのようにすればよいでしょうか?無理かな?
また、一度初期化した後は参照するだけで、マップの中身を弄くるつもりはないのですが
もしこのケースでメモリやアクセス速度を最適化できる方法があれば教えてください。

//とあるシステムのキーコード
struct HOGESYSTEM_KEYDATA
{
USHORT UnitId;
USHORT MakeCode;
USHORT Flags;
};
// WindowsのVK_XXと、Hogeシステムのキーコードのマップ(Win->Hogeの変換のみでOK)
map<int,HOGESYSTEM_KEYDATA> WinToHogeKeyMap = {
{VK_SHIFT,{0,0x2a,2}},
{VK_CONTROL,{0,0x1d,2}},
};
よろしくお願いいたします!

9:片山博文MZボット ◆0lBZNi.Q7evd
12/05/08 15:44:11.64
>>8
URLリンク(codepad.org)

10:デフォルトの名無しさん
12/05/08 16:23:31.17
>>8
C++11の初期化リストを使いたいなら
HOGESYSTEM_KEYDATA(std::initializer_list<int>)を実装する。


11:デフォルトの名無しさん
12/05/08 16:24:45.05
HOGESYSTEM_KEYDATA::HOGESYSTEM_KEYDATA(std::initializer_list<int>)ね。失礼。

12:片山博文MZボット ◆0lBZNi.Q7evd
12/05/08 16:51:18.02
識別子がなげーよ

13:片山博文MZ ◆0lBZNi.Q7evd
12/05/08 18:23:36.23
C++0xそんな便利なものがあるのか。でも、俺の古いコンパイラじゃ
initializer_listは使えないんだな、これが。

14:8
12/05/08 19:30:15.98
>>9
ありがとうございます!
無事に実装できました!

>>10
initializer_listは時間に余裕が出てから勉強させて頂きます!
情報有り難うございました!

15:デフォルトの名無しさん
12/05/08 21:14:30.60
教えてください。
今Linux上で作られたC言語ソース(TCP通信系の処理)をWindowsベース(VC MFC)に移植する作業をしているんですが、
コンパイルをすると以下のヘッダがインクルード出来ないってエラーが出ます。
sys/ioctl.h
sys/sockh

で調べたら上記のヘッダはLinux専用(?)なんで、VCでやりたかったらWinsock使いなさいって書かれていましたが、
Winsockで処理を書き直すのが面倒なんで流用出来る方法って他にありませんか?

無い知恵絞って考えたのは、gcc使ってLinuxベースのソースをDLLにしてVCからリンク時に読み込ませれば
良いんじゃないかと思って色々試してるんですが、gcc使ってのDLL化が良く分かって無いので下のサイトを
参考にしたのですが上手く行きません。
URLリンク(yun.cup.com)


コンプライアンスの関係上ソースを公開出来ませんが何か良い方法をご存知の方は是非ご教授ください。

16:デフォルトの名無しさん
12/05/08 21:18:31.41
>>15
スレ違い。VCのスレ辺りがいいんじゃない?

で、LinuxのソースをLinux上でDLL(so)にしてもVCではリンクできない。
Cygwin上でDLLが作れれば、リンクできるかもしれない。
でもCygwinでioctlまでサポートされているかは微妙。

これらを踏まえると、素直にWinSockで書き直すのが一番手っ取り早いと思う。
つーか、それが面倒な人がDLL化なんて面倒なことができるとは思えない。

17:デフォルトの名無しさん
12/05/08 21:21:07.30
>コンプライアンスの関係上ソースを公開出来ません
なら上司に聞けよ屑

18:デフォルトの名無しさん
12/05/08 21:45:33.62
>>16
やっぱりそうですか。
通信周りの処理なんですが、既存のAPIと挿げ替えただけで動くと思って安請け合いした結果、
思った以上に面倒だったので困ってしまいました。

あまり手を加えずに既存のソースを流用したかったんですが、難しいですかね。
ありがとうございました。

19:デフォルトの名無しさん
12/05/08 22:00:07.36
日本の失われた20年は在日マスコミの大嘘―日本は金融資産を増やし、成長を続けている

クルーグマンが、実は日本の00年代の一人当たりGDPの成長率はEU諸国、そしてアメリカよりも高かった事実を発表した。
バブルによる日本の不景気はあくまでも10年間で、それ以降は実はしっかり成長軌道に乗っていることを示して
失われた20年などというのは間違いで、無知な悲観論者の戯言だったとのこと。

※クルーグマンはノーベル賞やその他の経済学賞を受賞しているアメリカで最も著名な経済学者

URLリンク(image.space.rakuten.co.jp)

URLリンク(noahpinionblog.blogspot.com)
URLリンク(www.nytimes.com)

20:デフォルトの名無しさん
12/05/08 22:22:09.11
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

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

一応地鎮祭な

21:デフォルトの名無しさん
12/05/08 22:55:42.98
もう何年前になるんだっけそれ

22:デフォルトの名無しさん
12/05/08 22:58:42.97
winsock と Linux のソケットってそんな違いあったっけ?

23:デフォルトの名無しさん
12/05/08 23:02:42.12
read/writeと非同期

24:デフォルトの名無しさん
12/05/08 23:14:08.25
AF_UNIXが使えないとか、いくつか関数名が違うとか、インクルードファイルが全然違うとか、
初期化してやらないとまともに動かねぇとか、selectがソケットしか受け付けねぇケチ仕様だとか、
struct in_addrのメンバが違うとか、それくらいかねぇ?

25:デフォルトの名無しさん
12/05/09 03:46:32.58
>>21 URLリンク(logsoku.com)

26:デフォルトの名無しさん
12/05/09 07:02:21.45
double x,y;
に対して、
!(x>y)

x<=y
の結果って同じですか?
(infとかnanを気にしているわけではありません)

27:デフォルトの名無しさん
12/05/09 07:31:29.22
誤差を考慮する必要がある

28:デフォルトの名無しさん
12/05/09 07:39:26.70
そこがよくわからないのですが、
ビットレベルでそれぞれの不等式を実装した時にどういうことをやってるか教えてもらえませんか?
自分はx<=yを使わないようにしているのですが、誤差の意味でx<yのほうが優れていると言い切っていいのですか?

29:デフォルトの名無しさん
12/05/09 07:56:04.13
同じですか?なら同じと言っていい

何をしたいかによるが、前後の誤差を考慮することが多いという話

30:デフォルトの名無しさん
12/05/09 08:02:45.17
x yがともに浮動小数点数の計算結果の場合、


31:デフォルトの名無しさん
12/05/09 08:04:58.85
…誤差がありうるから、等号を含む比較にあまり意味がない

32:デフォルトの名無しさん
12/05/09 08:49:15.53
template <T,U>
bool compare(T x, U y) {
return x<=y;
}
みたいに使うので、intの場合にも同じ実装が使えることは(いまの目的では)けっこう重要です。
上にあるようにビットレベルで同じなら何の問題もないですよね?

33:デフォルトの名無しさん
12/05/09 11:09:32.29
浮動小数点の何を等しいとするかは
目的とする精度によって違うから

34:デフォルトの名無しさん
12/05/09 11:15:30.34
>>32
あんたがそれでいいのなら、それでいいよ。
うちじゃ話にならないけどね。

35:デフォルトの名無しさん
12/05/09 13:52:50.05
>>34
単純な話、
bool compare(double x, double y) {
return !(x>y);
}

bool compare(double x, double y) {
return x<=y;
}
の結果が、doubleで許される全値の組み合わせについて同じかどうか聞いてるだけなんですが。
違うなら違うと言ってくれたらいいのに。

36:デフォルトの名無しさん
12/05/09 14:25:50.25
全値の組み合わせを試せばいい

37:デフォルトの名無しさん
12/05/09 15:00:59.78
心配なら8桁ぐらいで切り捨てておけ

38:デフォルトの名無しさん
12/05/09 15:57:01.60
>>35
それが同じかどうかは環境依存。

39:片山博文MZボット ◆0lBZNi.Q7evd
12/05/09 16:41:00.33
>>35
コンパイラのアセンブリ出力オプションを試せば、
!(x>y)とx<=yの違いが分かる。

40:デフォルトの名無しさん
12/05/09 18:29:51.05
シングルトンってRelease()があるのが一般的なの?
解放した後に再確保できると、シングルトンと
グローバル変数のインスタンスと違いがはっきりするけど。

初期化が一度しか行われないこともシングルトンの用件だとしたら
解放されちゃまずいよね。

41:デフォルトの名無しさん
12/05/09 18:54:59.09
俺ならとりあえずRAIIなラッパかデリータ付きスマートポインタで
参照カウンタ付けとく
カウンタ0で解放とかするかどうかは内容次第じゃね

42:デフォルトの名無しさん
12/05/09 19:34:42.86
別に”シングルトン”の条件なんてどうでもいいな
そんな概念なんて教条的なOOPデザパタカルトのキチガイが気にするだけ

43:デフォルトの名無しさん
12/05/09 19:53:40.54
デザパタって「名前付けただけ」なんだよね
初心者への紹介も兼ねるけど

44:デフォルトの名無しさん
12/05/09 20:53:21.87
いや。デザパタ本にも書いてあるけど、
デザパタがあって、名前がある。
まだ名前の無いデザパタも複数有る。
デザパタ本は、前書きに有るとおり、
複数あるデザパタから特に良く使うものを抜き出して
紹介しているだけで、デザパタ本に書いてなければ
デザパタに非ずというような物でもない。

45:デフォルトの名無しさん
12/05/09 20:55:50.34
>>40
手段を目的にするなよ。
目的が達成できて問題がなけりゃ
どんな形式でもいいだろうが。

46:デフォルトの名無しさん
12/05/09 22:10:34.39
>>44
複数あるって何だよw有限個じゃねーんだから
設計なんて無数だろ

名前が付いて初めてデザパタだよ
アレは銀の弾丸なわけでもなく
名前を付けることが他者との意思疎通に有用ってのが主旨だろ

典型例の紹介だけなら入門書にでも書いときゃいいんだよ

47:デフォルトの名無しさん
12/05/09 22:37:45.31
>>46
「オブジェクト指向における再利用のためのデザインパターン 改訂版」
本位田 真一/吉田 和樹 監訳

この本のp13~15に書いてあった内容引っ張っただけだし、
お前は、お前のデザパタ定義を貫けばいいんじゃないか?

48:デフォルトの名無しさん
12/05/09 23:00:49.21
シングルトンクラスの利用者は
コンストラクタ・デストラクタを意識しなくていいよね?

49:デフォルトの名無しさん
12/05/09 23:07:08.47
>>47
ああ、お前もお前のデザパタ定義を貫けばいいと思うよ

Design Patterns: Elements of Reusable Object-Oriented Software
>In general, a pattern has four essential elements:

>1. The pattern name is a handle we can use to describe a design problem, its
solutions, and consequences in a word or two. Naming a pattern immediately
increases our design vocabulary. It lets us design at a higher level of
abstraction. Having a vocabulary for patterns lets us talk about them with
our colleagues, in our documentation, and even to ourselves. It makes it
easier to think about designs and to communicate them and their trade-offs
to others. Finding good names has been one of the hardest parts of developing
our catalog.


50:デフォルトの名無しさん
12/05/09 23:07:52.05
常識的な範囲内で美味いことやってくれるはずだから気にしなくて良い。

51:49
12/05/09 23:11:59.82
一応ソースってことで
URLリンク(my.safaribooksonline.com)

52:デフォルトの名無しさん
12/05/09 23:19:23.92
>>49
そらデザパタカタログに乗ってるものは名前ついてるわなw
一部だけ抜粋するんじゃなく、金だして一度全文読んどけよ

53:デフォルトの名無しさん
12/05/09 23:30:04.50
どうでもよろ

ま、デザインパターンの意図としてはパターンを有限個にしたいということであって>49で正解だが
可算無限濃度の設計の中から残すだけの価値があるパターンがこの先可算無限濃度見いだされる可能性は
>49とて否定できないハズ
なにしろ「洗練されたコード」と言うのと同じで数学的基準があるようでない世界だからな

54:デフォルトの名無しさん
12/05/09 23:45:47.55
「何がパターンで、何がパターンでないかは、人それぞれである。」

55:デフォルトの名無しさん
12/05/09 23:53:26.18
パターン入った!

56:デフォルトの名無しさん
12/05/09 23:56:24.63
シングルトンさえできりゃ他はいらん

57:デフォルトの名無しさん
12/05/10 00:01:07.16
>金だして一度全文読んどけよ
いや、お前が読んどけよ
どうやってあのURLを見つけたと思ってんだよ

>>53
俺は>>44
>まだ名前の無いデザパタも複数有る。
を否定しただけ
カタログにした理由、名前を付けることの意義
何故GoFがパターンに不可欠な4要素の第1項目をpattern nameにしたか、そういった話

あれを「さいきょうの設計かたろぐ」だと思ってる層から
意味不明な信者と、アンチが出てくるんじゃないかね

58:デフォルトの名無しさん
12/05/10 00:02:18.35
>>56
Factory MethodとStateぐらいは知っとこうよ

59:デフォルトの名無しさん
12/05/10 00:06:38.78
>>48
しなくていいけど
むしろシングルトンであることを意識しないで済む方がいいと思う
後でシングルトン(プロセス毎)からスレッドローカル(スレッド毎)に変える場合も楽

60:デフォルトの名無しさん
12/05/10 00:08:57.21
スレッドってどういうところに使ってるの?

61:デフォルトの名無しさん
12/05/10 00:14:22.10
>>58
んなもん聞いたことないわ

62:デフォルトの名無しさん
12/05/10 00:19:12.98
>>60
forkが使えない環境のときとか
GUIで重い処理中にキャンセルボタン出すときとか

63:デフォルトの名無しさん
12/05/10 00:20:49.30
>>60
ついぞ昔ならGUIプログラムの非GUI処理。
特にI/O関係。マルチプロセッサーやマルチコアが
現れてからは、並行処理で使われる事が増えつつ有る。

64:デフォルトの名無しさん
12/05/10 00:22:05.96
>>56
Singletonの方がよっぽど要らんだろうに・・・

65:デフォルトの名無しさん
12/05/10 00:27:55.90
結局はお互いのクラスでデータをやりとりできりゃ何でもできるようになった
シングルトンを知ってすべて解決した

66:デフォルトの名無しさん
12/05/10 00:33:25.78
グローバル変数より幾らかマシってものだしな

俺は実態がシングルトンでも
初期化引数かスレッドローカル経由かインジェクションで
xxxContextとかを渡す方が好み

67:デフォルトの名無しさん
12/05/10 00:41:28.38
>>61
Factory Methodを使うとC#におけるBeginInvokeみたいなことがサッと安全にできる
ていうかFactory Methodでクロージャを生成するのだと考えればマルチスレッド状況をスキーリ安全に扱える

Stateはキーマトリックスの処理ルーチンを書くのに個人的に重宝した

>>56
マルチスレッド状況下で呼ばれるSingletonは奥が深い…




68:デフォルトの名無しさん
12/05/10 00:45:48.49
フィライウェイトとか、ファクトリーとか入出力と組み合わせる事は有るけど、
クラスの外から見て状態を持ち変化があるものには絶対つかわんな
ループ中にどっか別の関数でシングルトンが書き換えられてたらデバッグしづらすぎる


69:デフォルトの名無しさん
12/05/10 01:10:58.56
グローバル変数がごく簡単に使える C++ でシングルトンとかマッチポンプすぎる。

70:デフォルトの名無しさん
12/05/10 01:14:27.49
グローバル変数を使うのが難しい言語の方が珍しいだろ

71:デフォルトの名無しさん
12/05/10 01:26:41.19
別にC++もJavaも変わらないよな
URLリンク(ideone.com)
URLリンク(ideone.com)
グローバル変数に直よりかは関数経由でアクセスしたり仮想関数使える方が良いだろう
まぁグローバル変数もシングルトンも使わない方が良いけど

72:デフォルトの名無しさん
12/05/10 09:59:09.71
自前クラスはポインタ使わず全部参照でやっていますが、
メソッド関数を呼び出すコードを見て、
「この変数は値を渡しているだけなのか、書き換えられて返ってくるのかどうか」がぱっと見分かりません。
(引数がconstかどうか調べれば判断つきますが、面倒で付けずに済ますこともあるし、呼び出し側のソースを流し読みしてるときに分かりずらい)

書き換えないなら必ずconst、呼び出し側のソース見てるときは、メソッドにマウスカーソル合わせて引数をチェック、
というやり方しかないのでしょうか?

73:デフォルトの名無しさん
12/05/10 10:07:28.94
>>72
そういうことにならないように関数名や引数並び、引数に使う変数名をちゃんとつける。
どうやったところで関数宣言を見ないのなら正確に把握というわけにはいかない。

74:デフォルトの名無しさん
12/05/10 11:18:37.08
>>72
それを嫌って、書き換える場合はポインタ、書き換えない場合はconst参照、と使い分ける人もいる。
私の場合、関数名にgetなどが含まれていて戻り値のない関数は、一番目の引き数が書き換え対象だ。

75:デフォルトの名無しさん
12/05/10 11:57:23.49
bool hoge(){
bool result = false;
/* いろいろ処理*/

// 戻り値の用意
return (ioResult&&sockResult&&time<10);
}

なんて関数をコーディングした場合、
if(hoge())
ではなく、戻り値必要ないので
hoge();
なんて書いた場合は、コンパイラの最適化でvoid版hoge()を作って、returnの行を出力しない、
みたいなことはしてくれるんでしょうか?
普通にbool版hoge()が呼ばれて、普通に関数内全部実行して、戻り値はテンポラリかなにかに入れてすぐ捨てるんでしょうか?

76:デフォルトの名無しさん
12/05/10 12:02:41.77
>>75
return の式に非ローカルな副作用が一切無いのであれば、そういう最適化は可能ではある。
ただしあまり大きな違いにはならなさそうなので、実際に最適化されることは少なくとも現時点では
あまりないだろうと思うし、気にするべきでもないと思う。

77:デフォルトの名無しさん
12/05/10 12:04:56.89
最適化されたコードのレジスタ確認してください

78:デフォルトの名無しさん
12/05/10 12:27:30.80
>>75
そのhoge()が同一翻訳単位内から呼ばれた場合は、インライン展開される場合がある。
そのとき、そのreturn文には副作用がないので省略される可能性は高い。
# 一部のコンパイラでは、同一翻訳単位外からでも最適化されうる。
とは言え、void版のhoge()が用意されるわけではない。

79:デフォルトの名無しさん
12/05/10 12:34:37.23
>>75は無理だろ。
hogeがstatic関数とかでコンパイル単位内ローカルなら可能かも知れんが
やってるコンパイラは無いだろう。

80:デフォルトの名無しさん
12/05/10 13:01:08.60
ああそうかインラインなら最適化できるね

81:デフォルトの名無しさん
12/05/10 13:41:32.29
staticじゃなくてもVC++のLTCGとかならやってくれるんじゃね

82:デフォルトの名無しさん
12/05/10 13:57:55.02
>>81
確かにそうかも。試してないけど。
最適化技術って進んでるんだね。

83:デフォルトの名無しさん
12/05/10 22:33:31.08
Microsoft (R) C/C++ Optimizing Compiler ならDLLに入ってても
インライン展開してくれるし、親クラスにキャストしてるオブジェクトの
仮想関数ですらインライン展開してくれるからな。

84:デフォルトの名無しさん
12/05/10 23:14:48.25
オブジェクトファイルかなんかと勘違いしてんじゃないか

85:デフォルトの名無しさん
12/05/10 23:23:53.10
勘違いってなんの事を言っている?

インライン関数のインポートとエクスポート
URLリンク(msdn.microsoft.com)(v=vs.80).aspx

86:デフォルトの名無しさん
12/05/10 23:52:13.14
それはインライン関数をDLLに入れられるって話で
DLL内の関数をインライン展開できるって話じゃないだろ

87:デフォルトの名無しさん
12/05/10 23:58:02.23
意味が解らないの?

注意
インポート インライン関数は、DLL のバージョン間で矛盾することがあるので、
インライン関数のインポート時は注意が必要です。インライン関数は、アプリケーション コード内に展開されます。
このため、関数を書き直した場合は、アプリケーション自体をコンパイルし直さないと、
インライン関数は更新されません。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。


88:デフォルトの名無しさん
12/05/11 00:20:06.29
それのどこがDLLの関数をEXE側でインライン展開できると読めるんだ?

89:デフォルトの名無しさん
12/05/11 00:23:33.94
namespaceの別名って、undefみたいに消せないのか?
どうせアセンブリコードに展開したときは、本来の名前空間の
名前になるんだから、不要になったら削除できてもいいだろうに

90:デフォルトの名無しさん
12/05/11 00:26:30.84
>>88
インライン展開しないなら、こんな事わざわざ書く必要ないだろ。
逆に「DLLにインライン関数定義してもインライン展開できません」と書くのが筋だろ。

>インポート インライン関数は、DLL のバージョン間で矛盾することがあるので
>。通常、DLL 関数は、関数を使うアプリケーションをビルドし直さなくても更新できます。

91:デフォルトの名無しさん
12/05/11 00:38:58.63
インライン関数を定義したヘッダとDLLが矛盾するケースがあるって話なんだが、それ
そもそも、リンク時に使うのはインポートライブラリであってDLLそのものは一切使わない


92:デフォルトの名無しさん
12/05/11 00:44:47.35
ヘッダーじゃねぇよ。cppに定義して、__dclspec(export) inline ~と書いた関数でも取り込まれる。
DLLを参照してるアプリケーションをコンパイルするとき、DLLが参照できればぶっこ抜かれるんだよ。


93:デフォルトの名無しさん
12/05/11 03:34:47.68
韓国で貯蓄銀行4行また営業停止
仰天!会長は元偽ソウル大生、中国密航で逮捕
URLリンク(jbpress.ismedia.jp)



自己資本比率5.6%、実はマイナス16.2%だった

営業処分の直前に漁船で密航を試みた会長の正体

金会長は、未来貯蓄銀行に対する営業停止処分が不可避と見て、かねて準備していた密航ルートを使って中国に逃亡しようとした。
金融委員会は未来貯蓄銀行など4つの貯蓄銀行を営業停止処分とした。
来貯蓄銀行の場合、粉飾決算を重ね、「5.67%」と発表していたBIS基準に基づく自己資本比率が実際はマイナス16.2%であることが明らかになった。
URLリンク(jbpress.ismedia.jp)

◆貯蓄銀行とは庶民専用の銀行

貯蓄銀行(ちょちくぎんこう)とは、個人の貯蓄を引き受けることを主目的とする金融機関である。
庶民に対して倹約を奨励し貯蓄により生活を安定させるための公益的な金融機関。
URLリンク(ja.wikipedia.org)

94:デフォルトの名無しさん
12/05/11 05:33:41.33
struct X {
const int x;
X(istream& is) try: x(read_int(is)) {
catch (何か) ...
}
const int read_int(istream& is) const {
int x;
is>>x;
if (x<0) throw 何か;
return x; }
};

int main()
{
X a(cin);//負の数が与えられるまで読み続ける
}

みたいなことってできませんか?

95:デフォルトの名無しさん
12/05/11 06:21:28.72
X(istream& is) {
int x;
for (;;) {
is >> x;
if (!cin) {
cin.clear();
cin.ignore( 1024, '\n' );
continue;
}
if (x < 0);
return ;
}
};

96:デフォルトの名無しさん
12/05/11 06:30:32.40
>>94
何がしたいの?

97:デフォルトの名無しさん
12/05/11 06:50:37.13
>>94
のポイントは、
- constメンバを初期化子を使って初期化していること
- tryブロックをそこにかまして、例外処理にしていること
です。
無論、95みたく普通にやればいいのだが。

98:デフォルトの名無しさん
12/05/11 07:11:41.62
>>95
はread_intね。いけてる気がする。

99:デフォルトの名無しさん
12/05/11 07:19:17.27
try {
cin >> x;
} catch (...) {
入力を求める
}
みたいなことを初期化子についてやりたかった。

100:デフォルトの名無しさん
12/05/11 07:33:31.87
int read_int(istream& is) {
try {
int x;
cin >> x;
return x;
}
catch (...) {
return read_int(is);
}
}
みたいな雰囲気。
例外の使い方がよくわからないし、istreamは例外投げないのかな・・・
ひっかかってくれない。

101:デフォルトの名無しさん
12/05/11 07:39:30.34
try {
int x=-1;
cin >> x;
if (x<0) throw x;
return x;
}
catch (int input) {
cerr << input << endl;
read_int(is);
}
でイケた。かっこよくね?

102:デフォルトの名無しさん
12/05/11 07:42:50.74
初心者だからアホーなことしてたら指摘してほしいです。
こんなので大丈夫なのかしら・・・。

103:デフォルトの名無しさん
12/05/11 07:44:39.57
status = !status;

これが右に偏ってる気がして気持ち悪いんだけど
どうにかならない?

104:デフォルトの名無しさん
12/05/11 08:19:53.45
うん

105:デフォルトの名無しさん
12/05/11 08:30:41.25
intだと上のでいいのですが、
double x; cin >> x;
の結果がよく分かりません。

stdinに数値でない"abc"を入れたときxは0にセットされるようなのですが、
doubleなのでx==0で判定するのも気持ち悪い。
cinが例外飛ばしてくれたりしますか?

106:デフォルトの名無しさん
12/05/11 08:36:01.98
飛ばさねーよ

107:デフォルトの名無しさん
12/05/11 08:43:35.84
やっぱif(cin>>x)で判定して、自分で例外飛ばせばいいか。

108:デフォルトの名無しさん
12/05/11 08:51:53.96
ところで95で
cin.ignore(1024,'\n');
としてる箇所ですが、INT_MAXとかを引数にしてもいいんですかね?
決め打ちを避けたいだけなんだけど。

109:デフォルトの名無しさん
12/05/11 08:56:45.82
>>105
std::cin.exceptions(std::ios::failbit | std::ios::badbit) ってやれば例外飛ぶよ。
cin に設定しちゃうと思わぬところで飛んで困るかもしれないけど。

110:デフォルトの名無しさん
12/05/11 09:03:59.04
>>109
へぇ、そんなのがあるんですね。
JavaだとデフォルトでIOException飛ばすから、コンパイル通すまで面倒だったりしますが。

>>108
numeric_limits<streamsize>::max()
を第一引数に渡すのはやりすぎでしょうか?

111:デフォルトの名無しさん
12/05/11 09:20:10.07
>>107
C++設計者の例。
URLリンク(www2.research.att.com)
の↓あたり。
while(cin>>d) v.push_back(d); // read elements
if (!cin.eof()) { // check if input failed
cerr << "format error¥n";
return 1; // error return
}


112:デフォルトの名無しさん
12/05/12 11:08:35.52
音声ファイルのパスSoundPathを受け取り、StartSampleからEndSampleまでの標本の値を調べ、
その区間の音量を返す関数を作ったのですが、現状ではwavファイルにしか使用できません。
mp3とoggにも使用できるようにしたいのですが、どのようにすれば可能ですか?

int CBgm::VolumeMean(int StartSample,int EndSample,char SoundPath[]){
FILE* fp;
errno_t err;
short int LVol=0,RVol=0;
int Ave=0;
LONGLONG Sum=0;
if((err=fopen_s(&fp,SoundPath,"rb"))!=0){
return 0;
}
fseek(fp,44+StartSample*4,SEEK_SET);
for(int i=0;i<EndSample-StartSample;i++){
fread(&LVol,sizeof(LVol),1,fp);
fread(&RVol,sizeof(RVol),1,fp);
Sum+=MAX(abs(LVol),abs(RVol));
}
if(EndSample-StartSample>0){
Ave=(int)(Sum/(EndSample-StartSample));
}
fclose(fp);
return Ave;
}

113:デフォルトの名無しさん
12/05/12 11:34:52.67
前もってユーザが自分でwavに変換するようマニュアルに書いておく

114:デフォルトの名無しさん
12/05/12 15:48:55.12
ま、ファイルから直接~じゃなくて、一旦展開してから同じように調べるとかでいいんじゃね?

115:デフォルトの名無しさん
12/05/12 15:49:55.94
適当なフリーの変換ツールでも呼べばいいんじゃね?

116:デフォルトの名無しさん
12/05/13 09:05:43.48
class X {
int a,b;
inline int f() { return a+b; }
int g() { return a+b; }
int h();
inline friend int plus(X& x) { return x.a+x.b; }
};
inline int X::h() { return a+b; }

hの定義につけたインライン要請は意味があると思うのですが、
クラス内で定義しているfにつけたところで、何もつけないgとまったく同等なのでしょうか?
あと同様にクラス内に書いたfriendについてもお願いします。

117:デフォルトの名無しさん
12/05/13 09:11:11.31
inline int X::h()これ以外全部意味がない

118:デフォルトの名無しさん
12/05/13 10:13:52.49
クラス定義内でメンバ関数・friend関数の定義を書いた場合、暗黙的にinlineがついてるものとみなされる

119:デフォルトの名無しさん
12/05/13 13:42:41.18
Cのライブラリ(たとえばcstdlib)を使う場合に、
グローバルな名前空間を汚染させない方法ってありますか?
namespace X {
#include <cstdlib>
}
はコンパイルエラーになってしまうのですが・・・

120:デフォルトの名無しさん
12/05/13 14:14:33.20
>>119 無い。

121:デフォルトの名無しさん
12/05/13 14:18:36.79
どうせstdlib.hからcstdlibとか名前かえるくらいなら、
namespaceに入れてくれたらいいのに・・・
あるいはstatic includeみたいなのでも。

122:デフォルトの名無しさん
12/05/13 14:19:52.84
cstdlibを使うのなら汚染させないのは無理だと思うけどstd名前空間にも再宣言されているからstdで使う

123:デフォルトの名無しさん
12/05/13 14:29:45.35
>>119
関数に限れば、汚染を特定のコンパイル単位内に限定する方法なら有る
特定のコンパイル単位においてのみCのヘッダをインクルードし、
そこで適当なnamespaceを設定して同名のwrapperでも書き、他所のコンパイル単位からは
同名のwrapperの方を呼べば良い
(※ printf()のような可変長関数の場合はwrapperからvprintf系を呼ぶ

C++の関数シンボルは引数型とセットでマングルされるので、
仮にwrapper外(C++世界)のグローバル名前空間でCのライブラリに含まれるのと同名の関数を定義しても
(extern "C" double ceil(double)等して明示的にCリンケージにしない限り)問題にならない


124:デフォルトの名無しさん
12/05/13 14:32:35.45
>>121
C++03 まではそのつもりで規格もそうなっていたけど、コンパイラベンダの反発(無視)が
何年も続いたため、 C++11 で規格のほうが現状を追認するようになってしまっている。
URLリンク(www.open-std.org)

125:デフォルトの名無しさん
12/05/13 14:43:32.30
>>122
なんという無意味な再宣言w
コーディング規約として、そうするか・・・

>>123
負担が線形増大w
けど参考になります。

>>124
ふむふむ、将来的にも予定はない・・・と。

126:122
12/05/13 14:51:25.13
>>125
こーやればいけたので報告
やっていいかどうかはわからないので詳しい人お願いします

#include <iostream>
namespace hoge {
#include <cstdlib>
  using::atoi;
}
int main(void)
{
  int a = hoge::atoi("4");
  std::cout << a << std::endl;
  return 0;
}

127:デフォルトの名無しさん
12/05/13 14:53:10.74
結局リンクの段階でどうしても汚染されるので
無駄だよ

128:デフォルトの名無しさん
12/05/13 14:54:22.82
汚染を防ぐじゃなくてstdじゃない名前空間で使うことね

129:デフォルトの名無しさん
12/05/13 15:03:15.52
それだけなら別にこれでいいじゃん

#include <cstdlib>
namespace hoge { using ::atoi; }

130:デフォルトの名無しさん
12/05/13 15:07:17.90
>>126
当然アウト。
17.6.2.2 [using.headers] p3
> A translation unit shall include a header only outside of any external declaration or definition, ...

131:デフォルトの名無しさん
12/05/13 15:16:09.34
>>126
GCC4.7でコンパイル通らないよ。

132:デフォルトの名無しさん
12/05/13 15:30:36.18
>>129
あーそうだね、ごめんなさい
>>126は忘れてください

>>130
解説あり

133:デフォルトの名無しさん
12/05/13 16:00:48.99
PODなら16byteの構造体に
多重継承でオペレータ関数を追加したら、28byteになってしまった。
多重継承にしたのは、他のクラスでも使うからで
アップキャスト等する予定はありません。
これを多重継承ではなくコピペにしたら16byteのままのはずです。
ただ、コピペするとクラスのコードが長くなって、望ましくありません。
サイズを増やさずに、継承のように再利用出来る方法はありませんか?

134:デフォルトの名無しさん
12/05/13 16:31:46.26
>>133 C++でおk

135:デフォルトの名無しさん
12/05/13 17:08:52.40
>>134 はげどう
>>133 C++でおk
多重継承で基底クラスと派生クラスのサイズが同じになるのが普通ジャネ、
みたいな質問をされると困惑するから具体例示せ


136:860
12/05/13 18:03:56.68
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : public A, public B { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。

137:133
12/05/13 18:06:33.52
※↑は間違いです。失礼
---
試してみました。環境はVC++2010EE SP1です。リリースもデバッグビルドも同じ結果でした。
---
struct A{ void f(){} };
struct B{ void g(){} };
struct C : public A { char a; };
struct D : public A, public B { char a; };
struct E : { char a; void f(){} void g(){} };

size of struct C is 1
size of struct D is 2
size of struct E is 1
---
このDが2になるのは何で?
再利用性を損なわずEのように1にしたい。
メタプログラムは避けたい。

138:デフォルトの名無しさん
12/05/13 18:22:49.23
>>137
URLリンク(codepad.org)
> size of C is 1
> size of D is 1
> size of E is 1

VC++2010EE の最適化が至らないといだけのことだな。

139:デフォルトの名無しさん
12/05/13 18:28:21.41
URLリンク(www.google.co.jp)

URLリンク(stackoverflow.com)

URLリンク(connect.microsoft.com)
> 終了
> 解決策: 修正しない
...
> 投稿者: Microsoft、投稿日時: 2006/04/11 11:50
> Hi: unfortunately even though this is a bug in the Visual C++ object
> model we are unable to fix it at this time given that fixing it would
> potentially break a lot of existing programs as the sizes of objects
> would change. Hopefully in the future we may be able to address this
> issue but not for the next release of the product.

140:デフォルトの名無しさん
12/05/13 18:32:38.27
俺もその結論に達しました。
クラスは空であってもサイズは1。
ただし継承元が空の場合、最適化で0とすることが出来る。
しかし、VC++2010EEの場合、継承元が2つ以下の場合しか最適化が効かないようです。
残念、こういう結果になるとは。ともかくありがとうございました。

141:デフォルトの名無しさん
12/05/13 19:18:04.32
int main(int argc, char* argv[]) {
vector<string> arg(argv,argv+argc);//ここまでOKだよね?
int res;
while ((res=getopt(arg.size(),&arg[0],"a"))!=-1) {
}
}
が通らない。
char* const*にconvertできないといって怒られる。
&arg[0]をc_strを指すポインタに変換しないといけない(?)ですが、
static_castで何とかなりますか?

142:デフォルトの名無しさん
12/05/13 19:20:05.07
ちなみに適当で
static_cast<char*>(&arg[0])
とやってもダメ。

143:デフォルトの名無しさん
12/05/13 19:34:20.71
>>141
何がしたいの? getopt(argc, argv, "a") してから arg 作っちゃダメなの?

144:デフォルトの名無しさん
12/05/13 19:37:58.28
>>126
#include<c~>でインクルードして
グローバル名前空間に関数が展開されるのは規格違反
MSのクソコンパイラー以外じゃコンパイル出来んぞ

145:デフォルトの名無しさん
12/05/13 19:38:05.27
>>143
stringとvectorでラッパを作ろうと思って。

146:デフォルトの名無しさん
12/05/13 19:43:57.51
わざとヤッてるとしか見えんな

147:デフォルトの名無しさん
12/05/13 19:46:05.79
>>144
>>132

148:デフォルトの名無しさん
12/05/13 19:51:06.88
static_castはダメだけど、
reinterpret_cast<char**>(&arg[0])でイケた。
違いがわからんw

149:デフォルトの名無しさん
12/05/13 20:10:31.93
>>140
VC++2010EEつうか、Windows SDKにも入ってる
MSのMicrosoft (R) C/C++ Optimizing Compilerの問題じゃね。
EEだろうがどのエディションでもコンパイラーは同じだから問題も同じ。

150:デフォルトの名無しさん
12/05/13 20:10:51.44
>>148 コンパイルは通るかもしれんが、イケてないよ。

151:デフォルトの名無しさん
12/05/13 20:11:34.63
>>145 >>143

152:デフォルトの名無しさん
12/05/13 20:15:55.15
>>148
int main( int argc, char *argv[] )
{
 //std::vector<std::string> arg(argv,argv+argc); この時点でダメ
 int res;
 while( ( res = getopt(argc, argv, "a") ) != -1 )
 {
 }
}

getoptはchar**型を取るのであって、std::vector<std::string>を取れるように出来ていない
例え std::string args[argc];で有ってもアウト。std::stringとcharの配列には互換性が無い。


153:デフォルトの名無しさん
12/05/13 20:18:37.42
>>152
arg の初期化自体には別に問題ないだろ。 char* → std::string の変換がきく。

154:デフォルトの名無しさん
12/05/13 20:22:13.96
>>153
そういう問題じゃないだろ。
std::vector<std::string>をgetoptに突っ込めばいいと考えてる時点でダメなんだろ。

155:133
12/05/13 21:44:24.51
>>137
12クラスの多重継承を行った、とでも言うのでない限り、>137が>133(12バイトも増えた)の原因とは考えにくい
元クラスA,Bおよび派生クラスCそれぞれで仮想関数を使ってねえが
そう考えると、2クラスの多重継承で12 バイト増える説明がつく。
それぞれのクラスが仮想関数テーブルへのポインタを含むから、4*3で12バイト増。
(これは>138のサンプルでf(), g()にvirtualを付けると検証できる。

また、強いて言えば>137のサンプル(仮想関数抜き)で
どうして>133の多重継承理由(他のクラスでも使うから)になるのかわからん

別にMSを擁護するわけではないが、interfaceの多重継承みたいなことをしたいのだとすれば
基底クラスは必ずポインタ1個分(今日日のPCなら4バイト)の領域を占めるから、>140のような最適化の出番はない、
ハズ

156:135
12/05/13 21:47:48.55
155 = 135。しつれい



157:デフォルトの名無しさん
12/05/13 21:49:56.32
PODという用語を理解してるなら
仮想関数使うとサイズが増えるのくらい知ってそうな気もするけど
そうでない事もあるから困る

158:デフォルトの名無しさん
12/05/13 21:53:23.93
>>155
typedef やら static なメンバ関数やら、仮想関数以外にも継承したくなるものはあるだろ。

159:155
12/05/13 22:04:04.04
いやすまん、揉める前>155の「2クラス多重継承で12バイト増える」を訂正
>137のサンプルにおいて、
struct D : public A, public B { char a; virtual void f() { } };
としたとき、DとAは仮想関数テーブルへのポインタが共通
(単一継承と同様の関係で、DからAへのアップキャストは暗黙に行うこともできる)
だから、仮想関数テーブルへのポインタによる増分は12でなくて8バイト。
残り4バイトは、charより大きいデータ(ポインタ)を含むから、整列の都合上3バイト埋められ、
それでトータル12バイトになる。

160:デフォルトの名無しさん
12/05/13 22:26:12.53
でっていう

161:133
12/05/13 23:16:40.69
>>155
133で出したクラスは、
9個のクラスを多重継承しており、
うち1つは、2つのクラスを多重継承しています。

完全にノーコストだと思ってたんでやられました。
継承はやめて全部コピペすりゃいいんでしょうけど・・

162:デフォルトの名無しさん
12/05/13 23:33:09.77
組み込みでもやってんじゃないなら気にすんなよ
んなもん今日大したコストじゃねぇぞ
そんな事気にしてたらいつまで経ってもモノができん

163:デフォルトの名無しさん
12/05/13 23:51:21.35
どんだけ多重継承してんだ
継承なんて実際大して使わないと思うんだが
全クラスの2割くらいじゃね

164:デフォルトの名無しさん
12/05/13 23:54:03.40
継承多用も頭悪いヤツが嵌るワナの一種だから仕方が無いのだよ

165:デフォルトの名無しさん
12/05/14 00:04:51.01
継承なんてインターフェースの実装用としてしか使わんな
多重継承は使いまくる
実装継承使うときは、デフォルト実装が欲しいときぐらいだな
完全抽象化クラスを継承することがほとんど

つか>>133は何をどういう風に再利用する気なんだろう
再利用するとなると、<algorithm>がいろんなクラスに適用出きるように
普通クラス側でなくクラスを使う側なんだが


166:デフォルトの名無しさん
12/05/14 01:14:59.86
>>165
ベクトルです。float32 x 4で16byteな訳です。

多重継承している9種は、
ベクトルとの2項演算子
ベクトルとの単項演算子
ベクトルとの代入演算子
スカラとの2項演算子
スカラとの単項演算子
スカラとの代入演算子
などなど演算子が主です。

再利用化は、他に行列クラスにも使うためです。
合わせて6種類のクラスで使っています。

設計は満足のいくものだったんですが、
16Byteであるべきものが28Byteもあるようでは
はっきり言って使い物になりません。


167:デフォルトの名無しさん
12/05/14 04:27:49.77
>>166
こんなのはどう?

#include <iostream>
template<typename Vec, typename Any> struct A : public Any { void a(){}; };
template<typename Vec, typename Any> struct B : public Any { void b(){}; };
template<typename Vec, typename Any> struct C : public Any { void c(){}; };
template<typename> struct Empty {};
struct MyVec : A<MyVec, B<MyVec, C<MyVec, Empty<MyVec> > > > { float x,y,z,w; };
int main() {
std::cout << sizeof(MyVec) << std::endl;
}


168:デフォルトの名無しさん
12/05/14 07:37:20.88
継承じゃなくてマクロかincludeで対応するとか

169:デフォルトの名無しさん
12/05/16 20:03:33.91
public int FindIndex(Predicate<T> match)
{
}

List<T>と同じ挙動のFindIndexを作りたいんですが、
どう実装されてるのかわかりません
Predicate<T>からメソッドを取り出して、
フィールド変数T[] dataと一致を比較するにはどうしたらいいんでしょうか

170:デフォルトの名無しさん
12/05/16 20:10:22.47
誤爆してた、すみません
C#スレで聞いてきます

171:デフォルトの名無しさん
12/05/17 04:06:37.89
c丼もスコープ付きusingやtypedef使えれば
便利なんだがなぁ


172:デフォルトの名無しさん
12/05/17 19:49:25.05
相談室ってこんなに過疎ってたっけ?
・・・というのはさておき、

struct A {
const std::string get(const std::string& value) const {
return value;
}
const bool get(bool value) const {
return value;
}
};


これで
error: conversion from 'bool' to non-scalar type 'std::string {aka std::basic_string<char>}' requested
って怒られるのなんで?
string関係はいつもストレスやわ・・・

173:デフォルトの名無しさん
12/05/17 20:51:19.48
>>172

URLリンク(ideone.com)

再現するコードかかないとわからんよ

引数の型間違ってるだけじゃないの?

174:デフォルトの名無しさん
12/05/17 21:11:17.03
どうせa.get("abc")にしてんだろ
んでconst char*からの変換ではconst std::string&よりboolのほうが優先されて
返り値がboolなのにstd::stringで受けようとしてるからエラー

175:デフォルトの名無しさん
12/05/18 01:35:02.13
うわっ、申し訳ない。その通り。
a.get("abc")てしたせいです。

この問題って、もしかして
std::ofstream::ofstream(std::string)
が存在しなくて、char*にしてある理由と同じ?
なんでいちいちc_strにしないといけないのかいつも不思議だったんだけど。

・・・しかもC++0xで修正されているというのも更に分からん。

176:デフォルトの名無しさん
12/05/18 19:33:19.95
それとは関係ないだろ

177:デフォルトの名無しさん
12/05/19 11:32:06.88
>>166
ベクトル・行列演算クラスを自前で作っても、設計や速度の点で不満が出るかもしれない。
テンプレート使った高速化の設計ならBoostを見てみるといいかもしれない。
参考→URLリンク(www.page.sannet.ne.jp)

もしくは、浮動小数点やスカラーではなくベクトルや行列の演算は
CPUではなくGPUで処理したほうが圧倒的に早いいいので、
Windows環境限定でそこそこのグラフィックカード使えるなら
DirectX.MathやCUDAを使ったら早くなると思う。(LinuxでGPU使う方法は調べたこと無い)

こいつらより早い行列計算ルーチンを書くのは至難だよ。
CPUの性質やコンパイラの最適化とか熟知してる連中が作ったライブラリだから。

178:デフォルトの名無しさん
12/05/19 19:36:09.33
>>155
関係ないけど、未だに32bit環境がデフォと思っているやつは何なんだろうか?


179:デフォルトの名無しさん
12/05/19 19:43:35.13
>>177
CUDAが必要なレベルだとかなり大規模になる必要があるし、CUDAの持って行くのには別の苦労もあるから、MKLとかの方がいいぞ。
Sandy-Eがでてからは余程いいVGAはないと大きな差が出ないか、逆に遅くなるからな。

180:デフォルトの名無しさん
12/05/19 20:19:12.21
>>177
BoostはFortranのuBlasを再現したものだから
Blits++の方がいい。速度もこっちの方が速いしね。

181:デフォルトの名無しさん
12/05/19 20:51:21.10
Blitz++か
あの変態演算子オーバーロードか
カンマ演算子をオーバーロードしたライブラリは初めて見たよ

182:デフォルトの名無しさん
12/05/19 21:13:24.42
よく知らないけどEigenがいいと聞いた

183:デフォルトの名無しさん
12/05/19 21:31:33.61
>>181
>カンマ演算子をオーバーロード
そんなこともできるのか点点点

184:デフォルトの名無しさん
12/05/19 21:40:31.23
>>183
行列の要素を読み込むのに使ってる
ドキュメント読んでみ

185:デフォルトの名無しさん
12/05/19 21:49:13.44
A = 0.5, 0.3, 0.8, 0.2,
0.1, 0.3, 0.2, 0.9,
0.0, 1.0, 0.7, 0.4,
0.2, 0.3, 0.8, 0.4;

こんな書き方をするにはカンマ演算子のオーバーロードしかないだろ

186:デフォルトの名無しさん
12/05/19 22:41:45.37
自動的に4×4?

187:デフォルトの名無しさん
12/05/19 22:56:32.85
いや
Array<FixedPoint, 2> A(4,4);
って宣言してる

188:デフォルトの名無しさん
12/05/19 23:00:15.42
書き方はすっきりするけど
速度的にどうなんだろうか

189:デフォルトの名無しさん
12/05/19 23:07:43.73
初期化のつもりだろうからそんなに速度必要ないんじゃね

問題は肝心のテンソルの演算速度

190:デフォルトの名無しさん
12/05/20 17:53:27.61
C++ 2010で画面上部のプルダウンメニューからDebugをReleaseへ変更しようとしているのですが、プルダウンメニューが反転していて選択できません。
どうすればよろしいでしょうか?

191:デフォルトの名無しさん
12/05/20 18:00:27.85
>>189
Blitz++だと式テンプレート使いまくっててFORTRANと同程度の速度がでるらしい。
ただ、速度求めるなら最初からGPGPU使った方がいい気がするが。

192:デフォルトの名無しさん
12/05/20 18:51:40.18
CUDAみたいな類のは4桁×4桁をガンガン回すぐらいじゃないと牛刀
16×16ぐらいなら転送のコストで帳消しになるだろう

193:デフォルトの名無しさん
12/05/20 19:05:49.99
OpenCVとか必要ないレベルなら速度にこだわる必要もなくね?

194:デフォルトの名無しさん
12/05/20 19:49:45.50
>>191
FORTRANて別に速いわけじゃないのに、なんで使われているんだろ?
やっぱ過去の資産かな?
配列の並びが逆なのが気持ち悪い。

195:デフォルトの名無しさん
12/05/20 20:03:52.87
>>94
つ[ポインタのエイリアス問題]

C/C++はこれがあるために配列で最適化が十分に出来ない
VCなら__restrictとかC99でrestrictという予約語を使うとFORTRANと同等に出来る

196:デフォルトの名無しさん
12/05/20 20:04:11.77
ありゃ
×>>94
>>194

197:デフォルトの名無しさん
12/05/20 20:15:57.73
しかしこの過去スレひどいな

URLリンク(logsoku.com)

ちゃんとここに書いてあるのに

URLリンク(seclan.dll.jp)
7.6 restrict ポインタ

198:デフォルトの名無しさん
12/05/20 20:37:06.35
>>194
実際速いから。あとC++じゃベクトル命令(SSEの類ではない)
まともに自動で使えないから。

199:デフォルトの名無しさん
12/05/20 20:45:37.65
pascal の配列演算がなぜFORTRAN と並ぶに達せなかったのかに疑問が沸く

200:デフォルトの名無しさん
12/05/20 20:57:54.26
>>195
C++には無いよ。C++11なら無視されるらしい。

201:デフォルトの名無しさん
12/05/20 21:34:30.81
金が足りなかったんだろう

202:デフォルトの名無しさん
12/05/20 21:48:23.26
>>198
vector<double> x,y,z;
z=x*y;
的なこと?たしかにRとかで使うけどなれると便利だよな。
Pascalにもあるの?

203:デフォルトの名無しさん
12/05/20 22:14:52.36
>>201
コンパイラでそういうの早くしようとしたら、どういう頑張りが必要なの?
まったく想像がつかないんだけど命令手書きとか?

204:デフォルトの名無しさん
12/05/20 22:19:12.45
>>202
URLリンク(www.ss.isc.tohoku.ac.jp)
URLリンク(www.ss.isc.tohoku.ac.jp)
この辺の話にでてくるベクトル命令

205:デフォルトの名無しさん
12/05/20 22:25:08.49
>>202
B(1:99) = A(2:100)
こんなんとか。
Fortranならある範囲から、ある範囲に対して
演算を行える専用構文が存在するがCやC++には
存在しない。独自の拡張か、環境依存の関数を
使う必要が有る。

206:デフォルトの名無しさん
12/05/20 22:30:31.09
ベクトル回路に乗せやすいように配列データを並べて
固定回数の繰返し構文を見つけて専用命令を充てる。

207:デフォルトの名無しさん
12/05/20 22:55:46.78
C++もstd::valarrayを擬似クラス化して最適化できる
ようにすりゃいいんだけどな。演算子のオーバーロードとか
通常時は、演算毎にループして、最適化がかかった場合は
Expression Templateみたいに一つのループで一つの要素に対する
演算をすべて実行したりとかさ。

208:デフォルトの名無しさん
12/05/20 22:58:09.26
>>203
基礎研究レベルからの積み重ね以外にないだろう
商用のCやFortranのコンパイラがやってる融合変換や自動ベクトル化とか命令の合成とかは全部その上に成り立つもの
別に言語の仕様が高速化に向いてるからだとかいうものじゃない

209:デフォルトの名無しさん
12/05/20 23:06:09.20
>>208
配列演算ができるのと出来無いのじゃ差が大きいよ
GpGPU分野でもFortranがそのまま移植され始めたし

210:デフォルトの名無しさん
12/05/20 23:24:38.00
>>198
ここで言うベクトル命令ってSSEの類じゃないってどういうこと?
インテル系以外のプロセッサということなのか?

211:デフォルトの名無しさん
12/05/20 23:26:50.52
このスレに貼られたリンク先をよく見てみましょう

212:デフォルトの名無しさん
12/05/20 23:35:25.20
>>210
ここではベクトルプロセッサーのベクトル命令の事。
ベクトルプロセッサーの命令は、ループで回しながら
xmm0みたいな固定長のレジスタを使って演算する
わけじゃなく、演算命令に範囲と要素のサイズを
指定するだけ。構造がだいぶ違う。

213:デフォルトの名無しさん
12/05/21 00:35:17.00
>>212
なるほどよくわかった。ベクトル機向けだからか。
今だとCUDAに近い感じかな。




214:デフォルトの名無しさん
12/05/21 00:59:09.35
>>200
VCにはrestrictはないが__restrictという予約語でこっそりMS独自拡張されてる
ヘルプ見てみ

>>209
D&Eでも禿が「C++は演算分野でFORTRANと張りあうつもりはない」ってはっきり言ってるもんな
でも実際使われてる事も確かだし速度が少し遅くても答えさえでりゃいいって奴がおおいんじゃ
どうしてもいやならFORTRANをリンクして行と列を入れ替えれば済む話だし

ベクトルって並列演算の事だと思うけどスーパーコンピュータはほとんどベクトル機だから(Power PCを
並列につないで使ったりしてるもんな)C/C++で同じ事をやろうとすればOpenMPか>>213のように
GPUを使ったCUDAしかない

しかしGPGPUは単精度という致命的な欠点があって倍精度専用のGPUも発売されているが
これは気軽に買えるようなものではない

215:デフォルトの名無しさん
12/05/21 01:13:25.79
MS独自に拡張されてようとC++11には無い

216:デフォルトの名無しさん
12/05/21 01:16:42.78
ここC++11のスレじゃないんだけど
ちなみにC++03にもないです

俺が言ってるのはPCでrestrict使いたければVCかIntel C++(C99対応)を
買うしかないという事

スパコンも案外独自拡張されてそうだけどな
あれだけ演算速度を重視されるんだから

217:デフォルトの名無しさん
12/05/21 01:22:04.90
あ、やっぱり
ベクトル型スーパーコンピュータのC/C++はrestrictを独自拡張してる物が多いようですね
これがないとベクトルCPUやSIMDが使えないもんなあ

それか素直にC99を使うか

218:デフォルトの名無しさん
12/05/21 01:28:46.99
std::stringを継承させた
exstringというクラスを作ったのだけど
std::stringのいろんなコンストラクタをそのまま継承クラスでも使う方法ってないの?


219:デフォルトの名無しさん
12/05/21 01:31:36.96
stringクラスに仮想デストラクタはあるのか?まずそれが一番大事
無いとdeleteの時にメモリリークするぞ

次にコンストラクタは継承されないから自分で書き直すしかない
コピペしてそのまま呼び出せばいいのは初期化リストに入れれば良い

220:デフォルトの名無しさん
12/05/21 01:33:12.86
ポータブルなisnanの実装って可能?
doubleのビットを全部見たらnanについて何が分かる?

221:デフォルトの名無しさん
12/05/21 01:34:33.68
>>219
std::stringにアップキャストしたポインタをdeleteしなきゃリークしねーだろ

222:デフォルトの名無しさん
12/05/21 01:35:11.83
ちなみにexstringをポインタ経由でなくてインスタンスとしてしか使わないのなら問題ないけどな
それからexstring自身のポインタ経由で使うか

std::stringは「失敗した標準ライブラリ」だと良く言われる
理由は多量のコンストラクタに、整理されてない多量のメンバ関数
STLの前に作られたから仕方ないんだが
string用に最適化されている事を期待して諦めているが

223:デフォルトの名無しさん
12/05/21 01:50:02.37
>>219
おまいバカだろ

224:デフォルトの名無しさん
12/05/21 01:56:35.44
>>223
馬鹿というなら具体的な対応策をお前が>>218に呈示してやれよ

225:デフォルトの名無しさん
12/05/21 02:52:59.24
全然話は違うけどSTLPortのstd::ropeはどうなったん?
boostもC++11も見捨ててるみたいだけど、自然消滅?

226:デフォルトの名無しさん
12/05/21 04:21:31.83
>>220
IEE754でいいなら、ビットパターンでNaNを表現している。

227:デフォルトの名無しさん
12/05/21 04:27:55.75
std::stringじゃなくて
<boost/container/string.hpp>
使うのは?

228:デフォルトの名無しさん
12/05/21 04:43:06.94
>>227
本当だな
それだとslistも入ってるし不要なstringのメンバ関数がバッサリ切り捨てられてる
全部STLでやれって事だよな

229:デフォルトの名無しさん
12/05/21 06:11:32.83
>>216
正式に規格になったから、一応C++11もこのスレに含まれるっぽいぞ。
数カ月前向こうでそういう議論があった。
今C++11スレは、次世代規格やC++11の対応状況とかそんなスレになってる。
つか過疎ってる。

230:デフォルトの名無しさん
12/05/21 08:41:00.31
>>217
自分で書けばいいじゃん。
俺はクリティカルになるところは自分でかく。
それ以外は、コンパイラ任せ。

231:デフォルトの名無しさん
12/05/21 09:11:46.86
ropeは現在では遅延評価がある言語でエディタ実装する用途以外に使い道無い

232:デフォルトの名無しさん
12/05/21 12:36:03.13
ベクトル演算なんて自前でループなんかしないでippあたりのライブラリ使うから
どうでも良い

233:デフォルトの名無しさん
12/05/21 19:17:30.82
メモリの断片化を防ぐために、OSが不定期にデータを移動させることがあるそうですが、
現在、これによる影響を考慮するようなプログラムはないと考えてよいでしょうか?

昔(WindowsNTより前?):物理メモリアドレス=プログラムが参照するアドレス
→移動可能メモリを読み書きするにはロックが必要

今:物理メモリアドレスはOS管理の論理アドレステーブルで対応付けされ、プログラムからは常に固定のアドレス

234:デフォルトの名無しさん
12/05/21 19:31:11.61
どういうときに考慮する必要があるの?

断片化解消を阻止するプログラムでも作るつもりか?

235:233
12/05/21 19:36:58.90
>>234
DirectXにロックするAPIがあるんです。
現在はロックって必要ないはずですよね??

236:デフォルトの名無しさん
12/05/21 20:20:42.21
>>235
DMAとかでCPU以外からのアクセスがあるため、OSが勝手に移動すると困る

237:233
12/05/21 20:42:28.92
>>236
なるほど。
GPUから見た場合は論理テーブルみたいな仕組みがないので、
明示的に物理アドレスを固定しないといけないということなんですね。

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

238:デフォルトの名無しさん
12/05/22 15:19:56.67
uプリフェックスってコンパイラで指定したソースコードの文字コードを
UTF-16に変換してconst char16_t*型の変数に代入するって意味ですよね?
例えばソースコードがエスジスならばエスジスをUTF-16にへんかんするってことですよね?

239:デフォルトの名無しさん
12/05/22 20:57:41.81
だいたいあってるけど正確には違う

240:デフォルトの名無しさん
12/05/22 22:39:22.14
struct X
{
char x;
X( const X& o ) : x(1) {}
X() : x(0) {}
};

int _tmain(int argc, _TCHAR* argv[])
{
X x;
x = X();
return 0;
}

これ、コピーコンストラクタが呼ばれずにx.x != 1になってしまうんですが
なぜだかわかりますか? Visual C++ 2010です。


241:デフォルトの名無しさん
12/05/22 22:52:07.80
operator=が呼ばれてるからじゃないんけ

242:デフォルトの名無しさん
12/05/22 22:54:31.43
初期化と代入の区別はちゃんとつけよう!

243:デフォルトの名無しさん
12/05/22 23:14:03.53
コピーじゃなくて代入だから呼ばれないよね(´・ω・`)

244:デフォルトの名無しさん
12/05/22 23:25:39.40
>>240
operator=を書いてみ

245: ◆QZaw55cn4c
12/05/23 03:17:06.92
>>240
URLリンク(codepad.org)

246:デフォルトの名無しさん
12/05/23 07:22:31.20
同じ事を何度も言わなくてよろしい

247:デフォルトの名無しさん
12/05/23 23:34:18.12
template部分特殊化で
int float doubleは同じ処理で
string charは違う
その他のいろんなクラスは汎用処理
ということをしたいとする

int float doubleの同じ処理を3回書かないでプリプロセッサあたりで一回で書いてしまう方法ないでしょうか

248:デフォルトの名無しさん
12/05/23 23:41:58.93
template<class Signature>
struct my_class{ ... }; // etc type

template<class T>
struct base_int_float_double{ ... }; // int or float or double

template<>
struct my_class<int> : public base_int_float_double<int>{};

template<>
struct my_class<float> : public base_int_float_double<float>{};

template<>
struct my_class<double> : public base_int_float_double<double>{};

これじゃいかんのか?

249:デフォルトの名無しさん
12/05/23 23:47:57.51
>>248
ありがとう
それでいけます

250:デフォルトの名無しさん
12/05/24 03:41:09.75
中身はintだけど型がintと違うものを作りたくて
struct exint ; public int
{};
してみたらintはclassじゃないと怒られた。こんなものは作れないってことでいいの?

251:デフォルトの名無しさん
12/05/24 04:04:31.20
>>250
D言語でおk

252:デフォルトの名無しさん
12/05/24 04:49:36.72
オブジェクト指向もどきだから
何でもかんでもオブジェクトじゃないよ

253:デフォルトの名無しさん
12/05/24 13:53:23.19
newしたクラスのコンストラクタで、自分のメンバ変数にさらにnewしてクラスのオブジェクトを持たしている時
一番上位のオブジェクトをdeleteしたらメンバ変数のnewしたオブジェクトも消えるでしょうか?

つまり↓
newオブジェクト①->newオブジェクト②->xxxx ;

と続いている時、newオブジェクト①をdeleteする

この場合はnewオブジェクト②を削除したければ、そいつのデストラクタを呼ばないと駄目?

254:デフォルトの名無しさん
12/05/24 13:58:59.65
>>253
newしたオブジェクトはスコープアウトしても消えることがないので、ライターの責任でdeleteする必要がある。
だから消えない。

255:デフォルトの名無しさん
12/05/24 14:00:56.11
>>253
それはデストラクタに書くべき事でしょ
newオブジェクトにもデストラクタを書いておけば全部呼んでくれる
継承してないし簡単

256:デフォルトの名無しさん
12/05/24 14:12:45.06
例えばこれはメモリリークしない

class Base {
public:
Base* bp;
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp; }
~Base() { delete bp; }
};

int main()
{
Base b;

Base* bp = b.pointer();
bp->bp = new Base;
bp->bp->bp = new Base;
bp->bp->bp->bp = new Base;
}

257:デフォルトの名無しさん
12/05/24 14:20:05.69
bpがpublicというのは格好悪いのでprivateにした
やはりメモリリークはない
class Base {
Base* bp;
public:
Base() : bp(new Base) {
bp->bp = 0;
}
Base* pointer() { return bp->bp; }
~Base() { delete bp; }
};

int main()
{
Base b;

Base* bp = b.pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
bp = bp->pointer();
bp = new Base;
}

258:デフォルトの名無しさん
12/05/24 14:26:34.15
>>253
newしたらdelete
URLリンク(ideone.com)
スマートポインタの方がいい
URLリンク(ideone.com)
ポインタの必要がなければ普通にメンバにした方がいい
URLリンク(ideone.com)

259:デフォルトの名無しさん
12/05/24 15:23:47.59
>>258
タメになるなぁ。

>>257
ダメになるなぁ。

260:デフォルトの名無しさん
12/05/24 15:56:15.57
>>257
リーク以前にそれ無限ループじゃね?

261:デフォルトの名無しさん
12/05/24 16:14:14.63
>>260
やってみて言ってんのか

Base() : bp(new Base) {
bp->bp = 0;
}

が何のために書いてあるのか分からないのか

262:デフォルトの名無しさん
12/05/24 16:19:57.35
おれもコンストラクタが再起するように見えるけど。
開発環境入ってないから検証できないな。

で、Ideoneで試してみたら、ランタイムエラーだってさ。
URLリンク(ideone.com)

263:デフォルトの名無しさん
12/05/24 16:36:25.55
うん。スタックオーバーフローだから、実行するまでわかんない。VCとかだと何事も無く終了するw

264:デフォルトの名無しさん
12/05/24 16:38:47.40
>>257
ループの件とは別に、
>>256はbp->bp->bpで連結してるけど
>>257はBase::bpでなくmainのローカル変数書き換えてるだけなのでリークする

やりたいことは分かるけどサンプルは盆ミス回避のため実際に実行するに限る
URLリンク(ideone.com)

265:264
12/05/24 16:41:37.05
>盆ミス
そしてこの凡ミスである

266:デフォルトの名無しさん
12/05/24 17:00:14.45
>>261
やってみて言ってんのか

267:260
12/05/24 17:43:32.61
>>261
コンストラクタでのnewでまたコンストラクタを呼び出す <---- 無限ループ
試しに bp->bp=0; にブレークポイント仕掛けたけど、そこに到達する前にスタックオーバーフローした
見た瞬間に気が付くと思うんだけどなぁ


268:デフォルトの名無しさん
12/05/24 18:47:57.48
既に>259で答えが出てた。

269:デフォルトの名無しさん
12/05/24 19:51:23.02
どう見ても永久ループです
ありがとうございました

#include <iostream>

class Base {
Base* bp;
public:
Base(int i = 0) {
std::cout << "Base() " << i << " time(s) called." << std::endl;
bp = new Base(i + 1);
bp->bp = 0;
}
Base** pointer() { return &bp->bp; }
~Base() { delete bp; }
};

int main()
{
Base b;
}

270:240
12/05/24 20:52:39.67
>>240 のお答えありがとうございました。こちらは理解出来ました。

ただもうひとつ、疑問があります。
このoperator=()が適用されないんですが
なぜなのかさっぱりです。
というかこれは常識ですか?

URLリンク(codepad.org)

271:デフォルトの名無しさん
12/05/24 20:57:20.69
暗黙のうちに作られるoperator=(const X<x0,x1>&)があるから。
普通のメンバ関数なのでテンプレートより優先。

272:240
12/05/24 21:04:15.42
そうなんですか・・
デバッガでトレースしても何も無いし
暗黙なんて止めて欲しい・・
ともあれ、おかげで対策方法もやっとわかりました。
どうもありがとうございます。

273:デフォルトの名無しさん
12/05/24 23:25:58.77
Base() : bp(new Type()) {
}
初期化リストでnewするって無いよな
スマポ使えとまでは言わんが、せめて
初期化リストはNULL初期化だわ
効率もスマポ使った時と変わらん

Base():value1(NULL),value2(NULL)
try
{
  value1 = new Type();
  value2 = new Type();
}
catch(...)
{
  delete value1;
  delete value2;
}

274:デフォルトの名無しさん
12/05/24 23:42:36.30
いやそこはスマポ使えよ

275:デフォルトの名無しさん
12/05/24 23:43:59.04
NULLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL

いや、俺はちゃんとnew_handler記述するよ。

276:デフォルトの名無しさん
12/05/24 23:47:16.61
というかnewがこけるときって、どういう状態なんだろ?
もうガッタガタで、プロセス落とすしかないんじゃないの?

277:デフォルトの名無しさん
12/05/24 23:55:28.25
>>276
Effective C++読んでみれ。

第三版はどうなってるか知らんが、第二版ではかなり最初のほうで出てくる話題。
メモリ不足への対策は初級クラスのプログラマでも必須の知識だってことなんだよ。
イメージできないなら、まだ初級プログラマになれてない。

278:デフォルトの名無しさん
12/05/24 23:59:38.27
と、思っていま第三版の目次を確認したら後方に移動してたw
二版では2章7項だったが、三版では8章辺りの話題のようだ。

279:デフォルトの名無しさん
12/05/25 00:02:50.74
あ、オレ初級以下だわ

280:デフォルトの名無しさん
12/05/25 00:05:45.16
メモリが有限だってことさえわかれば自然と不足する状況なんて考えられるはずなのに、
それがわからないって言ってるやつは結局エラー処理をサボる理由が欲しいだけなんでしょ。

281:デフォルトの名無しさん
12/05/25 00:06:34.49
クラスに自分へのポインタを持ってそこにnewして入れるなら
再帰呼び出しになるから、引数を入れて深さがある程度になったら
止めるなどの工夫をしないとstd::bad__alloc例外が投げられるのは目に見えている

282:デフォルトの名無しさん
12/05/25 00:07:23.77
その前にスタックオーバーフローで止まるかハングしそうだけどね
処理系によってはスタックオーバーフローしても何も言わずにそのまま続行するから
たちが悪い

283:デフォルトの名無しさん
12/05/25 00:20:57.76
new と スタックがどう関わるか詳しく聞きたいものだな

284:デフォルトの名無しさん
12/05/25 00:37:07.29
コンストラクタの再帰呼び出しの機構は特に規格に入ってないけど
普通の関数のCALLみたいな機構で実現されてる場合が多いみたいです
だから先にスタックが逝くような感じ

285:デフォルトの名無しさん
12/05/25 00:56:04.36
ウェブ上で配信されているMJPEG形式のストリームを読み込んでメモリ上でパースしたいです。
どのような方針で書けばいいでしょうか。
よろしくお願いします。

286:デフォルトの名無しさん
12/05/25 01:01:57.44
とりあえず適当にバッファにとって切り取っていけばいいんじゃないでしょうか

287:285
12/05/25 01:36:52.37
ソケット作ってってことですか?
ストリーミング取得しやすくするライブラリでもあればいいのですが。
ちなみに対象のMJPEGの構造は把握しているので独自に解析するとして、今は自分の中に以下の3つの課題があります。
・データをどうやって取ってくるか
・送られてくるMJPEGを具体的にどのようにバッファして解析してバッファをリリース&次のデータを取得すればいいのか
・マルチスレッドで他の処理と並行して実行させたいので、プロセス内でjpgのやり取りをしたいのですが、
 例えばOpenCVを使った画像処理スレッドとjpgを取得するスレッドをどうやって連携させるのか

288:デフォルトの名無しさん
12/05/25 04:07:11.32
>>287
1. wget URL | お前のプログラム
2. read(stdin)
3. シングルで動いてから考えろ
 煽りじゃなくて本気でリファレンス実装作ってからじゃないとデバッグ大変よ?


289:デフォルトの名無しさん
12/05/25 04:37:11.10
大きな問題を小さく分割して1つひとつ実現するセンスが必要

290:デフォルトの名無しさん
12/05/25 06:01:17.57
>>275-276
new演算子の問題じゃなく、newに付けたコンストラクターが
例外を出した時が問題なんだけどな

291:デフォルトの名無しさん
12/05/25 06:24:09.31
>>275
new_handlerつかっててもコンストラクタでコケたらメモリーリークする
メモリーリークだけなら即致命的な事態にならないが
ファイルロックや排他など各種ロックが掛かりっぱなしになる

292:デフォルトの名無しさん
12/05/25 06:26:00.68
言葉が足りなかった。
>ファイルロックや排他など各種ロックが掛かりっぱなしになる
これは、ロックするタイプのオブジェクトをnewで確保していた場合な

293:デフォルトの名無しさん
12/05/25 07:32:03.94
だからスマポ使えよ

294:デフォルトの名無しさん
12/05/25 08:24:38.42
>>291
new_handler とメモリーリークは関係ないだろ。

295:デフォルトの名無しさん
12/05/25 09:28:57.73
スマポ使ったら負けだと思うんだ。(笑)

296:デフォルトの名無しさん
12/05/25 09:35:01.30
スマポこそ人類の英知だ
そうは思わんかね

297:デフォルトの名無しさん
12/05/25 09:46:28.44
>>295 けっこうよく居るな、こういうやつ。なんなんだろうな?

298:デフォルトの名無しさん
12/05/25 09:58:18.30
>>291-292
細かいアレだけど「コンストラクタが例外安全なコードになってなかったら」だろ?

299:283
12/05/25 12:10:39.91
>>239
kwskおねがいしま(ry

300:デフォルトの名無しさん
12/05/25 12:58:34.67
shared_ptr使ったらあっさり書けて拍子抜けしたわ
C++はGCが付いてないんだからスマポ使った方がいいかもね
メモリリークで本当に悩む

301:デフォルトの名無しさん
12/05/25 16:45:50.43
スマポが使えるなら使ったら方がいいが、
パフォーマンスやメモリの観点で使わない方がいい場合もあるからケースバイケースだな。

302:デフォルトの名無しさん
12/05/25 17:04:43.03
shared_ptrはともかくunique_ptrは消費メモリもオーバーヘッドも生ポインタと変わらんと思う

303:デフォルトの名無しさん
12/05/25 17:23:15.50
生成と破棄x30000000、sizeof比較

int*: time: 2.13s
URLリンク(ideone.com)

std::unique_ptr<int>: time: 2.13s
URLリンク(ideone.com)

std::shared_ptr<int>: time: 4.41s
URLリンク(ideone.com)

sizeof:
URLリンク(ideone.com)
> sizeof(int*) = 4
> sizeof(std::unique_ptr<int>) = 4
> sizeof(std::shared_ptr<int>) = 8

304:デフォルトの名無しさん
12/05/25 17:24:20.59
亡きauto_ptrさん
URLリンク(ideone.com)

305:デフォルトの名無しさん
12/05/25 17:56:17.19
ユニポすげえええええええええ

306:デフォルトの名無しさん
12/05/25 19:21:00.33
多機能ではなくスマートさを追求したユニークさんこそ至高

307:デフォルトの名無しさん
12/05/25 19:33:51.01
>>297
会社がboost使わせねェんだから仕方ねぇだろ

308:デフォルトの名無しさん
12/05/25 19:41:03.98
>>307
scoped_ptrくらいなら定義すればいいだろ

309:デフォルトの名無しさん
12/05/25 19:43:11.82
>>307
内製の糞ライブラリ使うしかないのかwww

310:デフォルトの名無しさん
12/05/25 19:49:48.85
社員の腕前まるっとまとめて信用されてないんだろ
紐付けとかないとなにやらかすかわからん集合無知みたいな

311:デフォルトの名無しさん
12/05/25 20:03:22.59
タダより高いものはないとか言ってセキュリティがうんぬん

312:デフォルトの名無しさん
12/05/25 20:10:06.48
じゃあ、コンパイラから全部内製で。

313:デフォルトの名無しさん
12/05/25 20:12:18.61
単にboost分からないから使わせないだけだよ

314:デフォルトの名無しさん
12/05/25 20:13:50.23
じゃあ標準ライブラリは完全にわかってるのか。すごいなぁ。

315:デフォルトの名無しさん
12/05/25 20:19:58.86
const auto_ptr ぐらいは使えるだろ

316:デフォルトの名無しさん
12/05/25 20:24:12.06
というかC++だって完璧にわかってるやつなんてそうそういねぇよ

317:デフォルトの名無しさん
12/05/25 20:50:09.14
C++はあのPL/Iよりも言語仕様が大きいんだぜ
全部覚えたら神様と崇めるよ

318:デフォルトの名無しさん
12/05/25 20:58:47.74
std::vector<Hoge>でHogeをコピーしないでHogeのデフォルトコンストラクタ呼び出す方法ありますか?

319:デフォルトの名無しさん
12/05/25 21:02:10.59
ソースで示して

320:デフォルトの名無しさん
12/05/25 21:06:08.79
>>318
resize

321:デフォルトの名無しさん
12/05/25 21:07:54.55
C++11より前だとコピるぞ。

322:デフォルトの名無しさん
12/05/25 21:08:02.54
resizeでコピーが発生せずデフォコンで構築されるのはC++11から

323:デフォルトの名無しさん
12/05/25 21:31:17.40
>>307
どんな理由で禁止されてんの?

324:デフォルトの名無しさん
12/05/25 21:45:46.59
上司「今の僕には理解できない」

325:デフォルトの名無しさん
12/05/25 21:47:35.90
上司「うちはBCC使ってるんだけどコンパイル通らないじゃんあれ」

326:デフォルトの名無しさん
12/05/25 21:47:36.00
「なぜあなたが理解できないということが禁止の理由になるのですか?」

327:デフォルトの名無しさん
12/05/25 21:47:46.73
>>323
テンプレが役に立たなかった時の名残

328:デフォルトの名無しさん
12/05/25 21:49:27.89
>>327
なら今はもう問題ないな。

329:デフォルトの名無しさん
12/05/25 21:50:34.36
VC6が未だ現役という・・・

330:デフォルトの名無しさん
12/05/25 21:51:37.50
boostのコンパイルが通らない環境の仕事つい最近まであった

331:デフォルトの名無しさん
12/05/25 21:53:21.90
先輩「STLも禁止な」

332:デフォルトの名無しさん
12/05/25 21:55:01.37
俺様「OTL」

333:デフォルトの名無しさん
12/05/25 22:13:36.61
Oresama Template Library

334:デフォルトの名無しさん
12/05/25 22:26:00.18
先輩「templateも禁止な」
俺「それC++を使う意味なくないっすか?」

335:デフォルトの名無しさん
12/05/25 22:26:55.36
C99非対応の処理系ならベターCとして十分実用性が

おっとMicrosoftの悪口はそこまでだ

336:デフォルトの名無しさん
12/05/26 00:23:07.53
>>334
3~5年前なら当たり前のようにそういう話があった
今でも少なくない

337:デフォルトの名無しさん
12/05/26 00:34:43.34
そうだな、昔も今もアホは居るからな。

338:デフォルトの名無しさん
12/05/26 01:21:21.23
もっと昔だと・・・templateは予約語だった

339:デフォルトの名無しさん
12/05/26 01:25:34.85
mapに特定のキーが登録されているかいないか調べる方法ありますか

340:デフォルトの名無しさん
12/05/26 01:27:44.73
find

341:デフォルトの名無しさん
12/05/26 01:30:26.65
count

342:デフォルトの名無しさん
12/05/26 02:09:27.73
VS2010を用いているのですが、コントロールがクラシックデザインなのはどうしようもないんですか?

343:デフォルトの名無しさん
12/05/26 02:13:27.57
>>342
URLリンク(eternalwindows.jp)

344:デフォルトの名無しさん
12/05/26 02:46:18.77
>>313
コンパイラが変わると、コンパイルが通らないからだよ。
ビルド環境にboostがあるとは限らんし。

早くboostがstlになればいいんだよ。

345:デフォルトの名無しさん
12/05/26 02:51:18.55
糞環境自慢されても

346:デフォルトの名無しさん
12/05/26 03:05:38.09
業界標準以外は導入しづらい

347:デフォルトの名無しさん
12/05/26 07:27:02.37
>>294
遅レス&&全レス読んでないが、関係はある
クラスFooのコンストラクタ内で例外が発生すると、
その時点で構築済みメンバのデストラクタはもれなく呼ばれるが
Fooインスタンス自体のデストラクタが呼ばれない
したがって、Fooがメンバとして単純なポインタFoo::m_pを含んでおり、
それに対するnewが成功した後に(別のnew等で)例外が発生すると
Foo::m_pが指すメモリを解放する奴が居ないからリークする

解決策はFoo::m_pのような奴を生のポインタではなくauto_ptrにするとか



348:デフォルトの名無しさん
12/05/26 07:41:07.42
いやすまんnew_handlerか、
new_handler中身でやることのパターンは何通りかあるが、結局例外を投げてしまう場合、と読み替えてちょ

349:デフォルトの名無しさん
12/05/26 13:07:43.57
コンパイラごとのSTLのアルゴリズムは
イテレーターのクラスによって要請されているインターフェイスの
オペレーターを全て実装していることを仮定されていますか?
よろしくお願いします。

350:デフォルトの名無しさん
12/05/26 16:52:27.58
>>349
C++に準拠してれば、C++の仕様に沿ったオペレーターを実装してるだろう。
C++に準拠してないコンパイラーの話なんかされても知らんがなとしか言えん。

351:デフォルトの名無しさん
12/05/26 17:23:19.31
>>349
何を聞きたいのかわからんが、
一応テンプレートに現れるシンボル(オーバーライドされたオペレータ含む)はtwo-phase lookupと言う規則で解決され、
インスタンス化しないテンプレートに現れるシンボルやオペレータについては宣言も実装も一切要らない

352:デフォルトの名無しさん
12/05/26 17:43:29.25
すなわちSTLアルゴリズムの使用するイテレーターテンプレートのインスタンスの
インターフェイスの提供するファンクションはSTLで実装されているイテレーターのイテレータークラス
によって類別されて決定される全てのファンクションが実装されていることを前提としているのでしょうか?

353:デフォルトの名無しさん
12/05/26 18:00:41.46
コンセプトが導入されてない現状ではそのアルゴリズムの実装が使うイテレータの機能だけが使用可能ならば問題ない
だから現状ではイテレータの要件を完全には満たしてないクラスを渡しても動作するアルゴリズムの実装はありえる

354:デフォルトの名無しさん
12/05/26 18:05:54.57
ただし、あるアルゴリズムがイテレータのどの機能(ってfunction=関数?)を使うかは実装依存。
一回動けばいいような書き捨てプログラムでもない限りきっちり作っておくが吉。

355:351
12/05/26 18:56:58.81
ああスマン、自作イテレータをSTLのアルゴリズムに食わせる話か、
初心者なものでイテレータはSTLのコンテナから出てくるものが全てだと思い込んでいた、

356:デフォルトの名無しさん
12/05/26 20:27:12.61
自前でちゃんとしたイテレータを書くのは
結構面倒くさいからboost使うといいよ

357:デフォルトの名無しさん
12/05/26 21:41:27.08
>>348 読み替えてもやっぱり new_handler とメモリーリークの関連が見えてきませんね。

358:デフォルトの名無しさん
12/05/26 21:50:08.94
変態イテレータあるよな
for_eachで回すだけで面白い事が出来る奴とか

359:291
12/05/26 21:52:12.10
>>357=294 ?
俺は、>>275がnew_handlerでなんとか出来るらしいと
書いてたからnew_handlerでメモリーリーク対策できなくねと書いたまで。
new_handlerとメモリーリークが関係するかはしらんがな。

360:デフォルトの名無しさん
12/05/26 21:57:56.25
そうか。すまんかった。

361:デフォルトの名無しさん
12/05/26 22:03:50.90
>>357
Fooのコンストラクタ内で例外を捕捉しないものとして、
>347な状況でnew_handlerから(何でもいいが)bad_alloc等の例外をスローすると、Foo::m_pが指す先のメモリがリークする
>347の状況であってもnew_handler内で(あらかじめ非常用にリザーブしておいたメモリから割り当てる等の手段で)
例外をスローせずに処理した場合、リークは起きない

よって、new_handlerの中身がリーク発生に全く無関係とは言えない


362:デフォルトの名無しさん
12/05/26 22:09:06.28
空きがもうない状況の話なのに
空きがあったらってぶっちゃけ関係ないよな

363:デフォルトの名無しさん
12/05/26 22:18:29.67
>>362
>空きがあったらってぶっちゃけ関係ないよな
空き0前提はともかく、非常用のリザーブ領域まで0前提なのか否かはスレの流れからは自明ではありませんね~
new_handler内でユーザー向けダイアログボックス用にリザーブ領域メモリを割り当て、
エラー表示した後プログラム終了、という設計も有り得る

364:デフォルトの名無しさん
12/05/26 22:22:05.70
>>363
newが例外を出した時点で、new_handlerは失敗してる。

365:デフォルトの名無しさん
12/05/26 22:25:43.17
>>363
newが例外だしてりゃリザーブ領域空ですよね

366:デフォルトの名無しさん
12/05/26 22:30:47.43
>>364,>>365
kwsk
デフォルトのnew_handlerを自作new_handlerに差し替えた後でも
newが勝手に例外をスローするというのは初耳


367:デフォルトの名無しさん
12/05/26 22:36:04.77
>>366
自作new_handlerが何も割り当てできなかったらNULLでも返す気か?
要点は例外じゃなくて、new_handlerがなすすべがない状態におちいてっるて
所なんだからそれぐらいは解れよ

368:デフォルトの名無しさん
12/05/26 22:41:05.88
>>366
つまらん事で意地をはるな
得することなんて何もないんだから

369:デフォルトの名無しさん
12/05/26 22:48:40.40
>>367
自作new_handlerなんだから、なすすべがない状態に陥らないように設計もできるよ?
単純な方法としては、プログラムの起動時に数KBかそこらのメモリを非常用にnewしておき、
そのポインタを大域変数g_pReservedに記録、
その後本当にメモリが0になったらg_pReservedからとりあえず返し、ただしプログラム終了フラグをセットして
速やかにプログラムを終わらせる、みたいな

そのためのnew_handlerです


370:デフォルトの名無しさん
12/05/26 22:53:03.92
>>365 の話がでてるのに、リザーブがあればという。
もうダメだなこの人完全に意固地になってる

371:デフォルトの名無しさん
12/05/26 22:53:30.08
>>369
g_pReserved が使われた後にもっかい new したら同じこと。

372:デフォルトの名無しさん
12/05/26 22:55:46.29
>>361
元々可能性の低い失敗がもし起こったらどうなるか、って話をしてるのに
可能性をもう少しほんのちょっとだけ下げる方法の話をしても意味ないでしょ。

373:デフォルトの名無しさん
12/05/26 22:57:52.31
>>369
話の論点からずれるけどアホだろあんた
最初にnewしてなければその分空きがあったはずで、意味がない。
new_handlerとして有効な使い方は、高速化の為にだけ先読みしてた
画像データなどのキャッシュ解放。不要なデータを削除すんのが普通。

#余談だから無視してくれ

374:デフォルトの名無しさん
12/05/26 23:09:46.56
>>370
デフォルトのnew_handlerを自作new_handlerに差し替えた後ならnewが勝手に例外を投げることはないから、
>365の言うような現象は起きない。よって、>365に基づく批判はナンセンスだし

>>371
まあそこらの細かい設計は一考を要するが、
別にg_pReservedをただ一つのオブジェクトに一括で返さねばならないわけでもなし

>>372
可能性を下げる方法の話ではないよ。プログラムを正常終了させる話。
本当にヒープ0になってからでは何も仕事はできない、という主張をするなら、
後始末という仕事を正しく遂行するため用のメモリをあらかじめ確保しておくという発想に到らねばおかしい

>>373
無視するが、>372へのレスの通りである



次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch