1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
91 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 16:54:34 ] >>85 ヘッダで宣言してソースで定義すればいいんじゃないの?
92 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:50:01 ] >>90 コードに埋め込めばユーザーが変更できないとでも?
93 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:03:16 ] >>91 俺もそれ思ったけど、 定数自体よく増えそうじゃね? その場合、定数取得用の関数に文字列渡して ソースの方でマッピングするくらいしか無いと思う。 マクロ使って、開発中は関数+文字列渡しで、 リリース時は本当の定数にするのも手だけど、 うまいマクロ書けずに諦めた。
94 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:29:25 ] 潤沢なCPU資源のある今の時代、別に毎回文字列をmapから探しても大して問題はないと思うな。 適当なテキストファイルにa=bの形式でひたすら列挙したものを読み込むクラスとか、そんなに手間でないし便利だから作っておくといいんじゃね? 俺は保存とかコメント付けもしたいからxml使ってるが。
95 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:42:44 ] おれは>>91 の方法だな >>93 は同じような文字列(宣言と定義)を2箇所に書くのがいやだとかそういう話?
96 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:21:47 ] >>95 じゃなくて、値だけがよく変わるならそれ(cppの書き換えだけ)で良いけど、 定数が増える場合は宣言も当然追加しないといけないので、 ヘッダ書き換える事になって、 結局includeしてる全cppがコンパイルし直しになるな、と。 まぁ、>>85 が定数増やすこと有るかどうか分からないけどね。
97 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:25:14 ] ヘッダ一つに定数一個だけ宣言して 定数使うソースは使う定数の分だけヘッダをインクルードすればいいんじゃね?
98 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 22:40:18 ] BCC 5.5.1であるテンプレートクラスの変数をメンバに持つクラスがいて、このクラスのヘッダの段階では テンプレート引数にくるクラスが前方宣言されただけの時コンパイラに未定義の構造体と警告されてしまいます。 でもcppの方で実際の定義が分かるので、一応コンパイルは通ってるみたいなんですが、 コンパイラを黙らせるにはどのように書くのが良いのでしょうか? ヘッダ class hoge; class piyo{ sokuseki_ptr<hoge> hoggee; }; ソース struct hoge{ 〜 } (hoggeeの使用)
99 名前:デフォルトの名無しさん [2008/06/07(土) 23:27:42 ] C++でDLL作成に挑戦しています 公開するAPI関数の定義(XXX.h)を extern "C" {} ブロックで囲っているのですが、 関数の本体(XXX.cpp)も同じように extern "C" {} ブロックで囲う必要があるのか分かりません もちろんインターネットで検索をかけていますが、今のところ有用な情報がないです 両方とも囲う必要があるのか教えてください
100 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:36:28 ] >>99 試してみれば?
101 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:45:59 ] >>100 コンパイルは通りました defファイルも作成できました しかし、これで正しいのかが分からないのです
102 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 23:48:23 ] >>98 BCB2007の付属品のBCC5.9.3では何のエラーも警告も出ない。 5.5.1のバグというか癖では?
103 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:08:39 ] ソート済みのvectorに対してupper_boundで取得してきたイテレータから そもvectorにおけるインデックス番号はどうやれば取得できるでしょうか?
104 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:11:18 ] std::distance()
105 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 00:24:29 ] >>99 名前マングルか名前マングリングでググれ。
106 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:22:37 ] >>104 ほんとだ。ありがとうございます!
107 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 01:33:02 ] >>105 いくつか有用な情報が得られました ありがとうございました
108 名前:デフォルトの名無しさん [2008/06/08(日) 02:07:53 ] 質問です。 VC++2008を使用しているのですが STLのvectorのsize()って、メソッドが呼ばれたらその都度数えているのでしょうか? それとも、内部に、数量を管理する変数があって、その値を返しているのでしょうか?
109 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:11:13 ] 実装次第。 VC6 の STL なんかは begin と end のポインタを保持していてその差を返してるが、 全ての STL でそういう実装になっているとは限らない。
110 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:11:44 ] 普通はその都度数えます とはいっても引き算1回 意味的には vector<T> v; v.end() - v.begin() と同じ
111 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 02:17:45 ] 数えるにしても、少なくとも O(1) の数え方ではある。 strlen みたいな O(N) の数え方はしていないな。
112 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:00:16 ] リストと違って定数時間が保証されてる
113 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 03:25:40 ] spliceとどっちを優先するかだね。
114 名前:108 mailto:sage [2008/06/08(日) 06:23:00 ] レスどうもありがとうございます。 それほど遅くはならない仕様なんですね。 今使ってるプログラムは 配列を使ってmalloc()で逐次拡張していくプログラムなんですが これをvectorに置き換えたんですが、なんか100倍近く遅くなってるんですよね。 基本的に、配列と同じく[]しか使わなかったし mallocで1つずつ拡張してた場所をresizeやらpush_backに置き換えただけなのに・・・。 元が1時間くらい回しっぱなしのプログラムなので、vectorに置き換えたら10時間くらいかかるようになってしまった・・・。
115 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 07:52:43 ] >>114 vectorは一般的に[]は速く、resizeやpushu_backは遅い。reservを調べよ。
116 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:28:37 ] FreeBSD7.0のgcc4.2.1では vectorは1つの連続したメモリで管理しています。 resize()、push_back()は内部の配列のメモリは大体二倍ずつ増えるようになっています。 resize()は縮小しても内部のメモリを再割り当てしない様になっています。 STLのソースを読むのが早いのではないですか?
117 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 08:59:30 ] vector<A> v; void f(vector<A> v); f(v); とかやってるんではないですか? void g(vector<A>& v); ではなく。
118 名前:85 mailto:sage [2008/06/08(日) 09:00:57 ] >>91-97 アドバイスを参考に色々考えた結果、ヘッダで宣言して定義をソースに書き、 設定する値は、デバック時はINIファイルやXMLファイルから読み込み、 配布時は埋め込んだコードを使うということにします。 アドバイスありがとうございました。
119 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 10:17:40 ] >>114 VC++2008のSTLはセキュリティのために色々やっていて遅い。 #define _SECURE_SCL=0を書いてからヘッダをインクルードすると それがなくなってだいぶ速くなる。
120 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 10:41:43 ] >>119 そんなうえーんな事って他のコンパイラにもありうる? 例えば2005とか
121 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 11:42:21 ] むしろ2005からそうなった。
122 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 12:13:34 ] >>115 typo ひどすぎw
123 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:54:03 ] typoはコンパイラが教えてくれるから兵器だもん!
124 名前:デフォルトの名無しさん [2008/06/08(日) 15:03:54 ] defalt:
125 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:34:26 ] カタカナでdefaultとか書こうとすると、typoで酷いことになるよね
126 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:43:43 ] defualt:とtypoしてラベルと見なされた事がある
127 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:47:00 ] >>120 セキュリティとはどんなセキュリティで なにをしているんですか?
128 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:27:56 ] std::vector<int> hoge; int* p = &hoge[0]; // NOT SECURE!!! っていう
129 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:31:09 ] >>119 それわざわざヘッダに書かずコンパイラオプションでいいよな ポータブルなC/C++コードをコンパイルしたいときは その手の呪文をやたらと唱える必要あるよね、VC++8以降だと
130 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:33:15 ] >>127 operator []やイテレータでの範囲チェック。 ナントカ_sって関数に変えないCと違って、 何もしなくていいというのはC++さすがというべきところだけど、 どうしてもお節介という感じは否めない。
131 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:11:08 ] 速度を落としてでも安全方向に振るっていうのは、C++の理念に反発してる。 そんなのはC#でやればいい話だ。
132 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:19:52 ] いつからお前の思想がC++の理念になったんだよ。
133 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:28:20 ] C++自体はオーバーヘッドは抱え込まない。 オーバーヘッドのある冗長なチェックをどこまで行うかは、ライブラリの実装しだいで使用者の自由ってことかな。
134 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:38:38 ] 単なるデータ構造使いたい場合でも、 class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが起きたりとか・・・ 工夫すりゃ回避できるけど、言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。
135 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:43:07 ] >>134 コンストラクタが呼ばれてオーバーヘッド? どんな場合の話だ?
136 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:43:20 ] プログラミング言語C++とC++の設計と進化をよむと 実効速度を重視して言語を設計してますよね。
137 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:46:30 ] >>134 >class使っちゃったら、コンストラクタが呼ばれてオーバーヘッドが いいえ >言語自体は"デフォルト"では、オーバーヘッドだらけでしょ。 いいえ D&EのC++言語の設計ルールの章に書かれてるけど、 C++には「ゼロオーバーヘッドルール」というのがありまして。
138 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:24:49 ] オーバーヘッドをコントロールできるかどうかが問題だと思う
139 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:56:29 ] 理想論でゼロオーバーヘッド言ってても 実際問題、速度差が出てるんだから、言い訳出来まい。
140 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:58:08 ] 仕方ねーだろコードの肥大でCPUキャッシュからは溢れるし 仮想関数だって投機実行が効かないんだから
141 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:59:53 ] インライン展開するからコードの肥大化は関係なし 理想論だけどね ;-)
142 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:08:26 ] インライン展開するから肥大化すんだろ
143 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:13:07 ] Cでもコンストラクタや仮想関数と同じようなことをしようとすれば同じだけ時間がかかる。
144 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:14:33 ] C++はCのつもりで書けばCと同じ速度で動くんだよね。 ただ、速度を犠牲にして抽象化したくなる誘惑が多いということで。
145 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:21:11 ] わずかなパフォーマンスと引き換えに、抽象化をしてメンテナンスに有利なコードを書くのか。 それともメンテナンスを犠牲にしてベタコードでパフォーマンスを追及するかの選択は使用者が選べるのが利点だわな。
146 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:34:03 ] C++のfstream.writeはどうして第一引数がconst void*ではなくchar*なのですか?
147 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:40:17 ] 理由は知らないけど、現実にvoid*してもキャストが減るわけでもないし、テンプレート書くときvoidの引数があるといろいろエラーが出るしメリットないもんな
148 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:58:28 ] basic_fstream<char>だからcharしか受け取らんという意図なんだろうけど、 バイナリ指向なwrite関数はvoid*が使いやすいよな。
149 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:59:08 ] というかなんでconstが無いのかと
150 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:04:59 ] charの配列しか動作は保証されないんじゃない?
151 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:09:55 ] え?constはあるだろ、流石に
152 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:12:39 ] >>149 実は俺も「マジで?」って思ってググッたw 大丈夫const付いてる。146が省略しただけ。
153 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:22:34 ] 個人的にはmemcpyのsrcにconstが付いてて欲しい。
154 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:33:58 ] >>153 それもconstついているぞ。
155 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:35:51 ] じゃ、じゃあmainの第二引数にconstが付いて欲しい!
156 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:39:31 ] class A :public const B も許して欲しい。
157 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:42:33 ] むしろclass要らなくね? structだけで良いよ。
158 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:59:10 ] >>157 classとstructの違いが分からないとは
159 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:05:22 ] template<struct T> asdf{ typedef T type }; typename asdf<int>::type;
160 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:26:55 ] >>158 分かった上で言ってるんだけど。 class無いと出来ないことってあったっけ?
161 名前:デフォルトの名無しさん [2008/06/08(日) 23:32:05 ] template<typename T> asdf{ typedef T type }; いらねーな、やっぱw
162 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:33:01 ] >>148 basic_fstream<wchar_t> のことを考えると 已む無しなんだろうなあと思う。
163 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:22:27 ] >>160 こんなのとか template <template <typename T> class U>
164 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:25:05 ] template <template <typename T> typename U> もういっその事 template <(template <typename T>) typename U > にしちゃえば良かったのに
165 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:33:24 ] template <typename T> class U { }; をそのまま突っ込む形(現状)がベストだと思うけど。
166 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:38:57 ] template <template <typename T> class U> がよくて template <template <typename T> typename U> template <template <typename T> struct U> がダメな理由がわからん。
167 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:39:49 ] たしかに本質的にはclassは無くてもいいが、構文上は必要だな ただ、元からclassが無ければ↓という構文になっていただろうけどな template <template <typename T> struct U> まぁ、あの偉大な禿も万能なわけじゃないからな
168 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:41:49 ] class でも struct でも OK にして、 それなら typename も OK でいいだろって感じにして・・・ って感じに C++0x でなったりするのかな。
169 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 00:55:47 ] classの方が打ちやすいYo むしろstructを非推奨に ところで何で、びよよん先生を禿っていうの? ハゲてるから?ハゲだから?
170 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:06:07 ] 英語ネイティブな人間にはclassという単語がしっくり来るからでしょ C++の誕生当時はオブジェクト指向は一般的じゃなかったから 言語側がユーザーを啓蒙する必要があったんだと思う
171 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 01:36:18 ] classっていうと階級が最初に出てくるんじゃないかな 階級闘争でいうところの階級な 中産階級とか、総中流意識とか ブルーカラー、ホワイトカラーとか そういうイメージ 嘘だけど
172 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 08:52:46 ] classって1年2組のことでしょ
173 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:20:37 ] classはsimulaから来たのでしたよね?
174 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 19:58:32 ] 1993に恋をして君に夢中なんでしたよね
175 名前:デフォルトの名無しさん mailto:sage [2008/06/09(月) 21:06:43 ] 後ろ後ろ!
176 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 14:37:26 ] パーマン乙
177 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 18:25:19 ] std::basic_fstream<unsigned char> は使っても問題ないでしょうか?
178 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 22:36:39 ] >>177 見慣れないうえにあんまり意味無いと思うからお勧めはしない。
179 名前:デフォルトの名無しさん mailto:sage [2008/06/10(火) 23:31:49 ] char_traits が定義されてないとダメなんじゃないかな。
180 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:13:48 ] std::basic_fstreamがstd::iostreamみたいにC++に規格として盛り込まれているのか、 あるいは処理系に依存するのかをききたいんじゃね
181 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:15:29 ] >>179 なるほど それでは std::char_traits 相当の UcharTraits を定義して std::basic_fstream<unsigned char, UcharTraits> とすると使えるでしょうか?
182 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:16:29 ] 理論上は使えるんじゃないかな? 多分。
183 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:41:47 ] >>180 やりたいことは put( unsigned char ) と write( const unsigned char*, streamsize ) を使ってバイナリデータをファイルに書き込むことです。 このとき1バイトは0から255を表現できないといけないので最低 unsigned char の型が必要です。 型が char の場合、どの処理系でも使える範囲は0から127までなので目的を果たせません。
184 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 01:54:15 ] >>183 バイナリデータとしてみると算術型は違ってもビットパターンを変更しないキャストは実質的に同じデータを指す。 writeはchar*を引数に取るけど、そのポインタがintであれwchar_tであれエンディアンとサイズが正常であれば問題ない。 つまり任意のデータのポインタをchar*として見ることは、その先にあるデータをビットパターンを変更せずにキャストする事に相当する。
185 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:01:01 ] >>184 キャストとはちょっと違う。 char* はオブジェクトの内部表現となる メモリの読み出し〜書き込みに使えることになっている。これは unsigned char も signed char も同じ。 ってことで、バイナリ出入力したいだけなら普通の fstream で十分。
186 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 02:15:47 ] ios::binary を指定しておけば fstream で何の問題も無くバイナリの入出力ができる。
187 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 13:00:02 ] >>185 それは仕様書で言えばどのあたりで分かるでしょうか? JIS X 3010-1993 は6章ぐらいまで目を通したのですが見当たりませんでした。
188 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:23:35 ] エンディアンについても実装がバラバラなのが許容されるのにオブジェクトの内部表現って言及されてるの?
189 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:39:28 ] >>187 185じゃないけど、 ISO/IEC 9899 [6.5.3.4] でどう? sizeof(char)==1の保証 → 単位粒度で扱えることの保証。
190 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 16:56:05 ] これかな 3.9 Types 2 For any object (other than a base-class subobject) of trivial type T, whether or not the object holds a valid value of type T, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.36) If the content of the array of char or unsigned char is copied back into the object, the object shall subsequently hold its original value. 36)By using, for example, the library functions (17.4.1.2) std::memcpy or std::memmove.
191 名前:デフォルトの名無しさん mailto:sage [2008/06/11(水) 17:14:51 ] >>724 ID出る板限定+多少巻き添え有りで良ければ、 NGワードのIDの欄に「O」を加えると消せる。