- 1 名前:デフォルトの名無しさん [2010/03/05(金) 16:51:13 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.71【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1264774545/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
- 35 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 19:57:49 ]
- よくわかんないんだけど
もしポインタの使い方が間違った場合 ソフトだけが暴走して終了すればなんともないの? OSにダメージが及ぶことはない?
- 36 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:02:36 ]
- 運が悪いと爆発するっていってんだろ
- 37 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:01:47 ]
- 組み込み怖い組み込み怖い
- 38 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:03:29 ]
- >>35
まずありえないだろうけど 最悪の場合にはコンピュータでできることならなんでも起こりうる HDDがフォーマットされたり ウイルスをばら撒いたり 恥ずかしいファイルが流出したりね
- 39 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:33:46 ]
- 意図的に扱いを間違えるとコンピュータウィルスと呼ばれるものが出来上がるわけだ
- 40 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 21:50:57 ]
- >>30
DOSやWin3.1のころはそうだったな。 今はアプリが落ちるだけですむ。
- 41 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 22:02:27 ]
- windows95の頃は一般保護違反で済むようになってたんだっけ
それでも何度か青画面出したと思うけどあれは一体なんだったんだろう
- 42 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 22:12:03 ]
- 95は完全じゃないけどそこそこプロテクトは掛かってる。けどまあよく落ちた。
- 43 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 23:33:38 ]
- 昔はC言語は怖くて使えなかったけど
今は安心して使えるんですね VC++はじめようと思います
- 44 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 18:23:46 ]
- namespace ns
{ static const hoge HOGE; } const hoge ns::Hoge = hoge(); 定数としてのグローバル変数をcppじゃなくてヘッダだけで定義したいんだけどできますか?
- 45 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 18:36:45 ]
- 処理系依存なら__declspec(selectany)とか__attribute__ ((selectany))とか
- 46 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:24:48 ]
- >>44
namespace ns { struct Hoge; template<bool Dummy = true> struct HogeHeaderOnlyConstants { static Hoge const HOGE; }; struct Hoge : HogeHeaderOnlyConstants<> {}; template<bool Dummy> Hoge const HogeHeaderOnlyConstants::HOGE = Hoge(); } d.hatena.ne.jp/Cryolite/20051129#p2 d.hatena.ne.jp/Cryolite/20051129#p3
- 47 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 20:21:34 ]
- なるほどーthx
- 48 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:18:04 ]
- *.hと*.cppが1対1でもexternって使わないとダメなんですか?
externの動きがいまいちわからない
- 49 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:34:31 ]
- extern=どこかにあるやつを使うぜ!実際どこにあるかはリンカまかせ
- 50 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:44:01 ]
- 拡張する予定が有るならextern
無いなら無名名前空間かstatic
- 51 名前:49 mailto:sage [2010/03/14(日) 14:01:47 ]
- >>49
>extern=どこかにあるやつを使うぜ! ・*.hに1つだけ変数を宣言する ・2つの*.cppから*.hに宣言した変数を使う ってことができるわけですか? >>50 >拡張する予定が有るならextern ここの拡張は、*.hと*.cppが1対nになること可能性があるって意味ですよね
- 52 名前:51 mailto:sage [2010/03/14(日) 14:02:29 ]
- 名前間違えました
>>51は48です
- 53 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:09:54 ]
- >>51
そう hoge.cpp int g_val;//実体はコレ hoge.h extern int g_val; 使う人 foo.cpp extern int g_valするかhoge.hをインクルード hage.cpp 以下同様
- 54 名前:48 mailto:sage [2010/03/14(日) 14:19:47 ]
- >>53
そうと言われても、>>49なのか>>50か分からないんですけど... ・1つの*.hを2つの*.cppで共有している ・しかし2つも*.hに変数を2つ書くのが(考えるのが)面倒い ・それじゃ、*.hに1つだけ変数を宣言して、あたかも2つ宣言したようしよう ってのがexternですね
- 55 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:26:46 ]
- とりあえず宣言と定義の違い、翻訳単位やリンケージについて調べてください
- 56 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:27:08 ]
- wisdom.sakura.ne.jp/programming/cpp/cpp24.html
の一番下のmain関数 Neko obj(::obj); の ::obj は何を指すんですか?
- 57 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:29:45 ]
- グローバル変数のobj。クラスの宣言と同時に定義してるやつ
- 58 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:53:19 ]
- >>57
ありがとうございます
- 59 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:59:28 ]
- friendって使い道あるの?
ネストクラスとかstaticメンバ関数つかえばよくね?
- 60 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:01:41 ]
- >>59
テンプレートが絡んでくるとそう簡単じゃないんだよ。 Effective C++ぐらい嫁。
- 61 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:32:10 ]
- iostreamやstdioなどの標準的なライブラリは
/usr/includeの下にヘッダファイルが保存されています 標準的なライブラリの実態はどこにあるのですか OS or コンパイラ?
- 62 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:33:33 ]
- 大抵ファイルシステム上のどこかです
- 63 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:00:06 ]
- >>61
ものによる。 /usr/include ってことはUNIX系だろうから、たいていOS付属で /usr/lib など。
- 64 名前:61 mailto:sage [2010/03/15(月) 00:11:33 ]
- >>63
普通に考えてみれば、/usr/lib/以下にありますよね /usr/libはソフトの実体が入っているな〜程度の事しか思っていませんでした /usr/libの中のデータは*.soが多いわけですし わかりました、ありがとうございます
- 65 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 02:10:20 ]
- >>61,64
もしかして、実体ってライブラリのことじゃなくてソースのことだった りする? それももちろん環境依存だけども。
- 66 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:09:33 ]
- Windowsでの話なのですが、
std::locale loc = std::locale(); loc = std::locale(loc, "japanese", std::locale::ctype); std::locale::global(loc); といった記述をDLLの冒頭に書いた場合、それを読み込むソフトや他のDLLにも影響は及ぶのでしょうか?
- 67 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:12:48 ]
- hoge.h
extern void hoge(); hoge.c void hoge(){内容} なんで、hoge.cには#include "hoge.h"と書かなくてもシンタックスエラーにならないんですか? C++でクラスを定義する時は、#include "hoge.h"と書かないとシンタックスエラーになるのに
- 68 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:16:19 ]
- >C++でクラスを定義する時は、#include "hoge.h"と書かないとシンタックスエラーになるのに
ならねーよ
- 69 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:21:41 ]
- >>67
何にも理解してねぇんだな。 #includeがおまじないの類だと思っている節が。 だれかおせーてやれ
- 70 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:28:23 ]
- >>66
個々のランタイムで管理しているので同じランタイムにリンクされているモジュール間で影響を受ける VC++2005で動的リンクで作ったなら同じプロセスに読み込まれてるVC++2005で動的リンクしているDLLが影響を受ける VC++6や2008で作ったものや2005でも静的リンクしたものは別のランタイムに属するので影響されない
- 71 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:28:54 ]
- // 関数hogeの宣言
extern void hoge(); // 関数hogeの定義 void hoge(){内容} // 関数hogeの参照 hoge(); // クラスFooの定義 class Foo { Foo() {} static FOO() {} }; // クラスFooの参照、インスタンスfooの定義 Foo foo; // クラスFooの参照 Foo::FOO(); // インスタンスfooの参照 func(foo);
- 72 名前:67 mailto:sage [2010/03/15(月) 13:33:57 ]
- >>71
thx でもさ、C++の時は#include "hoge.h"って書かないと コンパイラ様が怒ってくるんだよ
- 73 名前:69 mailto:sage [2010/03/15(月) 13:42:44 ]
- >>72
それは > C++の時は というか、単に "hoge.h" に クラスFooの定義 を書いているってだけじゃないのか? #include "hoge.h" の #include ってのは、"hoge.h" をその場所に取り込め(コピペ的に機械的に取り込め) って意味だから、これがないと "hoge.h" に クラスFooの定義 を書いている場合は クラスFooの定義 が見つからないとコンパイルエラーになるだろうけど。 でも#include "hoge.h"をしなくてもソースファイルにもう一度 クラスFooの定義 を 書けば別に#include "hoge.h"しなくてもエラーにはならない。 意味分かってくれる?
- 74 名前:69 mailto:sage [2010/03/15(月) 13:58:57 ]
- >"hoge.h" に クラスFooの定義 を書いている場合は
>クラスFooの定義 が見つからないとコンパイルエラーになるだろうけど。 クラスの定義はどうやって見つけるんですか? 知りたいことは、そこなんです
- 75 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:32:51 ]
- // hoge.c
class Hoge { }; Hoge hoge;
- 76 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:35:13 ]
- よくライブラリで構造体を
struct tagHOGE{}HOGE; みたいにtagなんちゃらにするのは何でですか
- 77 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:44:00 ]
- >>76
慣習です。 C/C++ではstruct tagHoge {...} hage;としたときにhageの型はstruct tagHogeになります。 C++ではtagHogeのようにstructを省略できますが、Cでは省略できません。 その為、しばしばCではtypedef struct tagHoge {...} Hoge;のようにtypedefすることになります。 このとき、typedef struct Hoge {...} Hoge;とするとC++ではエラーになります。
- 78 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 19:09:36 ]
- 了解しました
- 79 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 19:28:15 ]
- 同じにしてもC/C++共にエラーにならない
まあそういうコンパイラもあるのかもしれないけど
- 80 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 19:32:54 ]
- >typedef struct Hoge {...} Hoge;とするとC++ではエラーになります。
ならんならん JIS X3014 附随書C 7.1.3 にも全く同じ例が載ってる
- 81 名前:デフォルトの名無しさん [2010/03/15(月) 20:28:50 ]
- class Hoge{
private: int Num; double huga[Num]; public: Hoge(int Num); }; Hoge::Hoge(int Num){ this->Num = Num; }
- 82 名前:デフォルトの名無しさん [2010/03/15(月) 20:33:34 ]
- 中途半端だった・・・
こういった風にhugaのサイズを宣言したいのですが、これではコンパイルができません。どういう風にかいたらいいでしょうか?
- 83 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:35:46 ]
- >>81
std::vector を使う
- 84 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:51:36 ]
- class aaa
{ static const int bbb = 100; double ccc[bbb]; };
- 85 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:54:46 ]
- struct ar{double*const p;ar(size_t a):p(new double[a]){};~ar(){delete[] p;}double&operator[](size_t a){return *(p+a);}}*huge;
// を new deleteでつかう。
- 86 名前:66 mailto:sage [2010/03/16(火) 09:18:35 ]
- >>70
詳しく説明していただき、大変参考になりました。 ありがとうございました。
- 87 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 09:50:03 ]
- >>85
コピーコンストラクタと代入演算子は書こうぜ
- 88 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 10:06:23 ]
- >>76
blogs.msdn.com/oldnewthing/archive/2008/03/26/8336829.aspx これだな。 標準化前のCではタグ名の名前空間が分かれていなかったことが原因で、 それを受けた Windows プログラミングによってさらに広まったものだろう。 tag ならまだしも下線で始める奴が多くて困る。 www.kijineko.co.jp/tech/superstitions/tags-begin-in-underscore.html
- 89 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 10:10:47 ]
- >>80
実はまだ active issue になってたりする。 www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#407
- 90 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 01:33:03 ]
- JIS版C++ではOKだがISO版C++ではNG…ということか?
- 91 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 02:06:50 ]
- >>90
んなこたーない。ISOもJISも内容は基本的に同じ。 元々の規格の意図としては同じ名前も使えるようにしたかったようだけど、 厳密に解釈していくとなにやら矛盾のある状態になっているようだという話。
- 92 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 11:36:16 ]
- VistaにVC2003をインストールしたんですが、ダイアログデザイン
編集時にプロパティウィンドの中身が一切表示されません。 サポート対象外なのはわかっていますが、解決策があれば 教えてもらえないでしょうか
- 93 名前:デフォルトの名無しさん [2010/03/17(水) 18:31:40 ]
- class abc
{ abc(int); ・・・ } --- list<abc> a1; for (int i=0;i<10;i++){ a1.push_back( new abc(i)); } こんな感じで作ったa1を削除する時って、 a1の要素のabcのメモリ解放は、 ループさせて、いちいち要素ごとにメモリ解放をしていかないとダメですか? それとも、 a1.clear();で、全部やってくれるモンなのですか?
- 94 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 19:10:06 ]
- 自分でやんないとだめ
- 95 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 20:44:35 ]
- >>92
好きなのを選べ 1. WindowsXPをインストールする。 2. VisualStudio2008ExpressEditionをインストールする。
- 96 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:13:41 ]
- あるクラスAがあります。
このクラスをクラスBがコンポジションします。 クラスAのprotectedメンバー変数にクラスBからアクセスしたいのですが、継承した場合と違ってアクセスできません。 どのようにアクセスすべきでしょうか? A内にpublicな関数をつくり、その関数がprotectedメンバーの値を返すようにすればいいのでしょうか?
- 97 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:29:59 ]
- お好きにどうぞ。
- 98 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:46:37 ]
- どうするのが一般的なんでしょうか?
アクセスしたい変数は2個あって、そのために関数を2個用意するのはバカらしい感じがします。
- 99 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:49:21 ]
- friend
- 100 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 22:55:41 ]
- >>98
二個用意するのが馬鹿らしいなら設計を見直しましょう。
- 101 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:21:25 ]
- アクセス制御精査を心がけてるよと見せるのが主目的なら
抽出用一時オブジェクトとメンバ関数へのfriend指定を駆使して記述すれ
- 102 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:34:18 ]
- >>96
共通のメンバーを抜き出したクラスをクラスA,Bから参照すればいい。
- 103 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:42:07 ]
- >98
このスレッドに書き込む労力を アクセッサの実装に使ってください
- 104 名前:デフォルトの名無しさん mailto:sage [2010/03/17(水) 23:49:32 ]
- >>98
getter setterは邪悪
- 105 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 00:01:52 ]
- >>93
それ、 a1.push_back(abc(i)); でよくない? どうしてもnewしなきゃならないなら、shared_ptrを使うといい。
- 106 名前:デフォルトの名無しさん mailto:sage [2010/03/18(木) 23:50:38 ]
- >>96
Bに包含されることを前提にAを設計しているなら単にfriend指定すればいい。 そうでなければアクセサを書くか、メンバ変数自体をpublicにすればいい。
- 107 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 08:50:01 ]
- >>105
用途によっては shared_ptr をコンテナに突っ込むより ptr_vector の方がいいかもね。
- 108 名前:92 mailto:sage [2010/03/19(金) 13:29:45 ]
- やはりそうなりますかー。
ネットで調べてもそういう現象が見つからないし、 自分の環境固有の問題なのかなぁ ちなみに最近ではMFCが使われて無いみたいなこと聞きますが そうなるとウィンド周りは何で作るのが主流なんでしょう? SDK? CLI?
- 109 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 16:45:15 ]
- operator boolをそのまま実装すると色々とよろしくないようでsafeboolなるテクニックがあるようですが
ググっても何をやってるのかさっぱりわかりません どういう原理でsafeになるのでしょうか?
- 110 名前:デフォルトの名無しさん [2010/03/19(金) 17:09:07 ]
- Linuxでgccを使っています。
プログラム自身が使用しているメモリ量と、システムのフリーメモリ量を取得する方法を教えてください
- 111 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 17:33:51 ]
- >>110
OS板、OSスレでどうぞ。
- 112 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:40:36 ]
- >>109
more c++ イディオム safe bool でググるんだ。 普通にはアクセスできないポインタ型を変換演算子で返せば、ifで評価できるし、あれこれ暗黙な変換がされなくて済む。
- 113 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:42:30 ]
- int a=p+1;こんなのがsafeじゃない意図されない使い方
- 114 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:48:46 ]
- C++0xのexplicit conversion operatorsがあればsafe bool idiomはいらない子ですか?
- 115 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 19:56:24 ]
- そうだね。
でも、コンパイラの実装を待つことなく工夫してsafe boolを手に入れられる拡張性がC++のいいところだよね。
- 116 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 20:55:43 ]
- C++のコードをDLLにするのってめんどいな
例外出しちゃいけないからわざわざ例外捉えるだけのラッパー書かないといけないし 引数と返り値にSTL使えないし
- 117 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 22:58:13 ]
- それを突き詰めていくとな、いつのまにか劣化COMを作っている事に気づくのさ
- 118 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:02:59 ]
- >>116
多分、結局インタフェースコードはCかCOMにすることになると思うよ 労力ばかり無駄にかかる上に、CのDLLやCOMより相互運用性において劣る
- 119 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:06:13 ]
- WindowsならCOMでいいけど
MacやLinuxはどうすんの?
- 120 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:07:22 ]
- >>112-115
ぐぐってみてこのページを見たのですが ttp://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E5%AE%89%E5%85%A8%E3%81%AA_bool(Safe_bool) operator bool()ではなくoperator bool_type() constでもよいのでしょうか? で、operator bool_type() constの挙動は ok_がtrueであればthis_type_does_not_support_comparisons()のアドレスを返し、0以外の値なのでtrueと動作する falseならば0をかえしfalseとなる 例文の if (t2 == t1)や if (t1 < 0) のばあいはprivate関数のアドレスを比較するのでコンパイルエラーをはく ということでしょうか この場合なぜメンバ関数のアドレスを返り値とするのでしょうか? 質問続きで申し訳ありませんがよろしくお願いします
- 121 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:10:44 ]
- Cでいいんじゃないの
必要に応じてヘッダのみ、またはスタティックリンクのラッパーを書いて提供 つまり ユーザーコード - C++ラッパー - DLL境界 - Cインタフェース - C++実装 こうなる 面倒すぎて反吐が出るね
- 122 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:14:39 ]
- CORBA(笑)
- 123 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:18:10 ]
- >>120
普通のポインタだったらいろいろできて副作用があるから。
- 124 名前:デフォルトの名無しさん mailto:sage [2010/03/19(金) 23:40:28 ]
- >>120
キャストでいじってみるとわかるけどpointer to memberはキャストの制限がきつい だからかってに暗黙変換されてコンパイルとおって変な動作したりとかがなくなって安全なわけ
- 125 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 13:56:08 ]
- 質問です。
速度で考えると、floatとdoubleではどちらを使った方がいいのでしょうか。 最近のPCで動かす場合を考えているのですが、最近はfloatよりdoubleの方が早い、みたいな話を聞いたのですが・・・。
- 126 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 14:09:45 ]
- 32bitCPUならfloatもdoubleもそんなに差がないだろ
x86に限定して言うならどちらもFPUにロードした時点で80bitになる SSE使ってたらfloatの方が速いって事もあるけどな
- 127 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 14:15:09 ]
- >>126
64bitだと差が出ると言うことでしょうか? そして32bitなら、精度が高い分doubleのほうがよい、という事で合っていますか?
- 128 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 14:22:25 ]
- >>127
ああごめん 今昼間から酒飲んでるから答え半分に聞いてくれ 32bitCPUだとdoubleのロードにメモリアクセス2回必要だわな 64bitCPUだとそんなに差がないってのが正解か でも実測してみると分かるけどfloatでもdoubleでもそんなに差がないよ 結局FPUの演算に掛かる時間が食われてロードの時間なんて問題に ならないんだろうな
- 129 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:12:20 ]
- >>125
あなたが究極の性能を目指しているのでもない限り、doubleを使うべきです。 理由は幾つかあります。先ずはメリットを。 ・floatの方が演算処理が速い場合もある。特に、ベクタ化できる場合に2倍速くなるかもしれない。 ・floatの大きな配列の方が同じ要素数のdoubleの配列よりもキャッシュヒットが期待できる。そもそもメモリ容量的にdoubleではダメかもしれない。 ・三角関数などの標準関数はsin()とsinf()のようにfloat版が用意されていればそれを利用できる。 次にデメリットを。 ・一部の標準関数にはfloat版が用意されていない。また、sprintf()のようにfloatを渡すことができない場合もある。 ・floatとdoubleの変換は一般的にかなり遅い。 ・1.5のように書いてしまうとその定数はdoubleになってしまうので、1.5fのようにfloat定数であることを明示する必要がある。 ・以上のように、暗黙のdoubleへの格上げを禁止するにはアセンブリ出力を確認するような神経質な手続きが必要になる。 ・そもそも実数演算以外のコストが高くてfloatのメリットが殆どないかもしれない。 尚、doubleの方が速いのはCでは20年来の話。「最近はdoubleの方が速い」なんてことはないのでその話をした人は何か勘違いをしている。
- 130 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:15:13 ]
- お前は少しでも速いからと言ってshortを多用する気になるか?
余程のことがない限り深く考えずにintを使うだろ? floatとdoubleの関係はshortとintの関係と一緒だ。 深く考えたくなかったら黙ってdoubleを使っとけ。 簡単に纏めるとこれでいいだろw
- 131 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:18:59 ]
- >>129
メリットとデメリットの説明が逆のような気がする…。
- 132 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:22:36 ]
- >>131
いや、2行目に空白があるだろ?そこの行間を読んでみると、 彼はfloatにした場合の説明をしているんだろう。
- 133 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:28:24 ]
- >>125
とりあえず自分のマシンで実測してみれば?
- 134 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:29:16 ]
- >>133
そして/fp:fastを付けずにfloatが遅いと言い出すわけだ
- 135 名前:デフォルトの名無しさん mailto:sage [2010/03/20(土) 17:32:47 ]
- >>132
そ、そんなところに空白が…!!!
|

|