トップページ⇒tech
1001コメント296KB

C++相談室 part54

■ このスレッドは過去ログ倉庫に格納されています
0001v(^・^)v2006/10/30(月) 22:34:08
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE(VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
C++相談室 part53
http://pc8.2ch.net/test/read.cgi/tech/1159340181/
0685デフォルトの名無しさん2006/11/23(木) 15:53:45
>>684
expression template の前に、最適化かけて差が問題になってるかどうか確認しろ。
0686デフォルトの名無しさん2006/11/23(木) 15:54:38
>>679
× typedef struct _Vec {} Vec;
○ struct Vec {};
06876792006/11/23(木) 16:01:42
>>685
vs2003使ってるのでReleaseではき出したところ早くなりました。
しかし、Debugモードでも早く動くようにしたいです。

>>686
実行速度は変わりませんでした。
0688デフォルトの名無しさん2006/11/23(木) 16:04:24
>>687
コンパイルオプション弄れば
0689デフォルトの名無しさん2006/11/23(木) 16:12:55
>>679
Vec v(1.0, 2.0, 3.0);だとどうなる?
0690デフォルトの名無しさん2006/11/23(木) 16:26:26
>>688
そ、それはちょっと、、、

>>689
変化有りませんでした><
0691デフォルトの名無しさん2006/11/23(木) 16:49:54
>>687
>しかし、Debugモードでも早く動くようにしたいです。

なんで?

>>コンパイルオプション弄れば
>そ、それはちょっと、、、

何が「それはちょっと」なの?意味がわからん
0692デフォルトの名無しさん2006/11/23(木) 16:51:55
>>682
float三要素の構造体にexpression templateなんか使ったら余計に遅くなるよ。
expression templateで出来る一時オブジェクトと大きさが変わらんから。
06936792006/11/23(木) 16:54:32
>>691
最適化したらデバッグしにくくなるから。


>>692
では、こういう使い方は辞めといた方が良いのでしょうか?
0694デフォルトの名無しさん2006/11/23(木) 17:32:37
2項だけなら変わらんかもな。しかし遅くなるのはコンパイルとコーディングだけだろ。
0695デフォルトの名無しさん2006/11/23(木) 17:32:55
デバッグビルドで速くしたい理由が分からない
0696デフォルトの名無しさん2006/11/23(木) 17:45:02
>>693
上の質問にも答えろ低脳。
0697デフォルトの名無しさん2006/11/23(木) 17:46:01
>>694
実行速度が遅くなるよバカ
0698デフォルトの名無しさん2006/11/23(木) 17:47:05
速くすればデバッグも速く終わると思っている

いや、冗談だ。
0699デフォルトの名無しさん2006/11/23(木) 17:48:56
ベクトルなんてET適用の典型的な例だと思うんだけどなぁ
07006792006/11/23(木) 17:54:04
えっと、言い忘れましたが、今作っているのがゲームでして、
大量のソースをいちいちデバッグとリリースを繰り返しビルドするのは時間の無駄なんですよ、、
だから、デバッグビルドでも通常の動作をさせたいんです。
0701デフォルトの名無しさん2006/11/23(木) 17:59:48
>>700
まずデバッグビルドとリリースビルドがどう違うのか、その違いによって
それぞれどんな用途に使われるのか知ってればそんなことを望むはずはない。
0702デフォルトの名無しさん2006/11/23(木) 18:03:19
>>700
んなことできるんだったら「デバッグビルド」なんて存在しねーんだよ。

もうすれ違いだから出て行け。
0703デフォルトの名無しさん2006/11/23(木) 18:06:57
>>699
サイズ固定のVectorじゃなければな
0704デフォルトの名無しさん2006/11/23(木) 18:26:36
なんだ、低脳共ばっかりか
07056792006/11/23(木) 18:47:13
じゃ、どうすればいいか教えてくれお
0706デフォルトの名無しさん2006/11/23(木) 18:58:59
v*pperは家に帰れお( ^ω^)
0707デフォルトの名無しさん2006/11/23(木) 19:03:35
ublas::c_vector<float,3>
07086792006/11/23(木) 19:51:25
かいけつしたお
0709デフォルトの名無しさん2006/11/23(木) 19:55:07
そりゃよかったな
0710デフォルトの名無しさん2006/11/23(木) 20:02:17
>>679
してないお
07116792006/11/23(木) 20:03:17
こうだった
0712初心者2006/11/23(木) 20:57:20
各地でスレのモラルが向上したとして大好評につき、啓蒙文をVerUPしました。
以下のレスについては、必ずこの啓蒙文を付け加えましょう。
また、もし啓蒙文がない場合は、暗黙のうちにこの啓蒙文が了承されていると
みなされます。

以下、啓蒙文Ver3.0
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。
0713デフォルトの名無しさん2006/11/23(木) 20:58:39
STLスレがメインだからどうでもいいや
0714デフォルトの名無しさん2006/11/23(木) 21:06:25
余計なこと言うな
('A`)STLスレにまで感染したらどうする気だよ
0715デフォルトの名無しさん2006/11/23(木) 21:08:13
>>712
うるせー朝鮮人
祖国に帰れ!
0716デフォルトの名無しさん2006/11/23(木) 21:15:07
テンプレに変なもの書くようなスレだから祟りが起こって当たり前だな
07176792006/11/23(木) 21:27:17
結局、リリースビルドとデバッグビルドを使い分けろという事でしょうか?
0718デフォルトの名無しさん2006/11/23(木) 21:27:55
まぁ暇だから誰も書き込まないうちは適当に遊んで良いよ。
0719デフォルトの名無しさん2006/11/23(木) 21:28:09
>>717 はい、そうです。
07206792006/11/23(木) 21:57:55
>>717
承知しました。
ご迷惑おかけしました。
0721デフォルトの名無しさん2006/11/23(木) 23:40:15
うん、まぁわかんないことも多いだろうけど、頑張れ。
0722デフォルトの名無しさん2006/11/24(金) 02:49:36
このスレkusa○a○eが書き込んでるなw
0723デフォルトの名無しさん2006/11/24(金) 02:51:05
>>722
どのあたり?
俺にはkusak○b○っぽい書き込みは見当たらないが…
0724デフォルトの名無しさん2006/11/24(金) 09:38:53
>>723
そういうことにしたいのですね:)
0725デフォルトの名無しさん2006/11/24(金) 11:19:51
おまいら構造体のプレフィックスってどうしてる?

クラスなら C
メンバ変数なら m_
ポインタなら P
文字列なら状況により str

って付けてるけど、構造体は S だと文字列みたいだから、
とりあえず全て大文字にしているけど、おもいらどうしてる?
0726デフォルトの名無しさん2006/11/24(金) 11:24:19
>>725
すれ違い。↓逝け。

コーディング規約 第2条
http://pc8.2ch.net/test/read.cgi/tech/1068752664/
0727デフォルトの名無しさん2006/11/24(金) 12:08:59
>726
逝ってくる
0728デフォルトの名無しさん2006/11/24(金) 12:15:57
>>725
そんなものつけない。
0729デフォルトの名無しさん2006/11/24(金) 16:19:56
visual studio2005使ってるんですが、
long longって32ビットマシンだと32ビットのintとして振舞うんでしょうか?
遅くても64ビットintとして動いてくれたりはしないのですか?
0730デフォルトの名無しさん2006/11/24(金) 16:21:57
>>729
あり得ないだろ
0731デフォルトの名無しさん2006/11/24(金) 16:42:52
C99のlong longは少なくとも64ビットなければならないようになっている。
0732デフォルトの名無しさん2006/11/24(金) 20:15:13
少なくともVC++6.0の時代から__int64は32bit環境でも普通に64bit整数として演算可能だった。
0733デフォルトの名無しさん2006/11/24(金) 21:15:05
IA32上で実行したけど、sizeof(long long)は8だったよ。
0734デフォルトの名無しさん2006/11/24(金) 22:14:11
typedef struct {
  int a;
  int b;
} INT_STRUCT;

というのと、

typedef struct _int_struct {
  int a;
  int b;
} INT_STRUCT;


の、どちらが良いのでしょうか。
後者を使うメリットはございますでしょうか。
0735デフォルトの名無しさん2006/11/24(金) 22:25:03
>>734
あえて
struct _int_struct hoge;
と宣言したい時に使え
0736デフォルトの名無しさん2006/11/24(金) 22:28:30
>>735
それ長くて美しくない、却下
0737デフォルトの名無しさん2006/11/24(金) 22:29:55
>>734
メリットはない、プログラミング言語Cによれば
古いバージョンの互換性を保つために残してあるが使うべきではないと書いてある。
0738デフォルトの名無しさん2006/11/24(金) 22:59:11
後者はコンストラクタとか使うためなんじゃないの?
0739デフォルトの名無しさん2006/11/24(金) 23:01:28
>>737 thx!そういうことですか、了解しました。
>>738 スレ違いだった、、、Cです。




でわでわ!
0740デフォルトの名無しさん2006/11/25(土) 00:54:46
>>725
最近boostと同じ名前をつけるようにしてる
0741デフォルトの名無しさん2006/11/25(土) 01:08:42
>>734

typedef struct _int_struct {
int a;
struct _int_struct *next;
} INT_STRUCT;
0742デフォルトの名無しさん2006/11/25(土) 01:15:13
C++ではこの場合typedefは必要ない!

struct INT_STRUCT {
int a;
struct INT_STRUCT* next;
};

で十分
0743デフォルトの名無しさん2006/11/25(土) 01:15:42
>>740-741
スレ違いに亀レスつけてんじゃねーよ。
あと、タグ名に奇怪な名前使うのは即刻やめていただきたい。
0744デフォルトの名無しさん2006/11/25(土) 01:16:11
>>742
C++ではnextの部分のstructも不要だっ!!!!
0745デフォルトの名無しさん2006/11/25(土) 02:03:16
>>744
そうだったのか、

でも自分は、PODな(あるいはそれに近い、メンバだけの)structには、
慣れで、そういう風に書くだろうけど。
0746デフォルトの名無しさん2006/11/25(土) 02:17:02
美学にこだわるのは勝手だが、いらん情報は書かんのがC++流だと思うがね。
0747デフォルトの名無しさん2006/11/25(土) 02:26:49
>>742 >>744
で、C++では typedef, struct をつけるとエラーになるの?
0748デフォルトの名無しさん2006/11/25(土) 02:28:06
それくらい自分で試せ。
0749デフォルトの名無しさん2006/11/25(土) 02:49:44
>>748

注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス
で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく
スレの雰囲気を崩しかねないのでお黙り下さい。
また質問者は回答者に知識を披露する場を与える貴重な存在なので、
質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。
忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、
その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると
判断した方には評価いたしますので各自よく調べ、よく考え正確な回答を
するように。
0750デフォルトの名無しさん2006/11/25(土) 02:51:20
Intel C++ 8.1 (VS .NET 2003) では いずれもノーエラーだった。
でも付けないほうがすっきりしてるね。今後 C++流に簡潔に書くことにするよ。
他の処理系ではどうなのかな?
0751デフォルトの名無しさん2006/11/25(土) 07:03:16
c++では不要。
つまり、必要な処理系があればそれはc++ではないということだ(ぉぃ
0752デフォルトの名無しさん2006/11/25(土) 10:05:08
>>751
必要かどうかを聞いているのではなく、つけても問題ないかということじゃない?
つけても問題ないがつける意味は無い。
0753デフォルトの名無しさん2006/11/25(土) 12:06:37
カスタムiostreamの実装って難易度どれくらいですか?
何もしないNULLstreamがほしいんですけど。。。
0754デフォルトの名無しさん2006/11/25(土) 12:11:36
なんかWin32のOutputDebugStringをiostream化したページが
どこかにあったからそれ参考にするとか

いくつかのメンバを実装するだけだから難しくないかと
0755デフォルトの名無しさん2006/11/25(土) 12:12:03
つ[/dev/null]
07567532006/11/25(土) 13:12:33
レスありがとー。
なぜほしいかというと、クラスにiostreamのポインタを持たせて、コンソールにだしたりファイルにだしたりしたかったからです。


>>754
なるほど!できるかなー。
ちょっと探してみます。

>>755
いやー、ウインドウズなんですよ。提案は感謝。
0757デフォルトの名無しさん2006/11/25(土) 14:04:33
>>756
つ iostreamで使えるかしらんが、nullデバイスはあるぞ。
echo "hoge" > nul

('A`) さて、javaにもどるか
0758デフォルトの名無しさん2006/11/25(土) 14:08:32
>>756
('A`) ええのあったで
ttp://www.kab-studio.biz/Programing/Codian/iostream/06.html
0759デフォルトの名無しさん2006/11/25(土) 14:37:38
>>753
もし Boost を許容できるなら Boost.Iostreams を使って以下のようにできる

boost::iostreams::null_sink snk;
boost::iostreams::stream< null_sink > os( snk );
os << "hoge";
0760デフォルトの名無しさん2006/11/25(土) 14:59:55
>>756
Windowsなら>>757というわけでnulが/dev/nullに相当する。
0761デフォルトの名無しさん2006/11/25(土) 15:04:53
>>757
およ、そんなことできたんですね。何に使うんだろ??

>>758
よさげですね。ちょっと読んでみます。

>>759
Boostは見るたびにスゲーっておもうんですが、なんせ範囲がでかいもんだから、僕の許容量こえてるんですよね。TT
次期標準になってコンパイラについてくるようになったら覚えようと思ってます。
今回は見送りますが、提案には非常に感謝。
0762デフォルトの名無しさん2006/11/25(土) 15:15:43
>>760
用途が良くわからないけど便利なんですかね。
--

うんで、
>>758を流して読んでみたんですけど、streambufをがりがり書くかiostramに委譲すればできそうな感じですね。
ご協力感謝!
0763デフォルトの名無しさん2006/11/25(土) 16:15:02
>>762
コマンドラインレベルで作業しない人にはイメージが伝わりにくいけどこんなとき便利。

・余計な出力は見たくない
make > /dev/null

・空の入力を与えたい
awk 'BEGIN {print sqrt(2);}' /dev/null
0764デフォルトの名無しさん2006/11/25(土) 17:00:28
linuxrcなんかによく使うよね。
0765デフォルトの名無しさん2006/11/25(土) 17:17:33
struct : std::streambuf {} g_dummybuf;
std::ostream nullstream(&g_dummybuf);
俺、こんなんでやってた。もうどうでもいいね。じゃぁ
0766デフォルトの名無しさん2006/11/25(土) 18:13:45
Effectiveなんとかとか、Exceptionalなんとかとか、内容被ってそうなが本が
多すぎです。
取りあえず Exceptional C++ は読んだんだけど、次に読むとしたら
何がお薦め?
0767デフォルトの名無しさん2006/11/25(土) 18:18:14
>>766 >>3 の次ってことで >>4 がいいんじゃない?
0768デフォルトの名無しさん2006/11/25(土) 18:47:41
>>767
なるほど。 template 周りも一冊読んでおくべきかな。
あんまり深入りする気はないけど、最近の変態 C++er のコードを読める程度には
なりたいしなぁ。 C++ Templates 良さげだけど…分厚いな…。

落し穴に嵌まらないためのノウハウ的な方向は Exceptional C++ で
足りてるのかな。なんかあれ読んだら無性に不安になって…。
0769デフォルトの名無しさん2006/11/25(土) 23:33:54
>3 は全部読んだほうが良いと思う。
重複は気にしない。重要だから繰り返されているということですな。
0770デフォルトの名無しさん2006/11/25(土) 23:36:07
おっと、The C++ Programming LanguageとC++ Primerはどっちか読めばよさげ。
0771デフォルトの名無しさん2006/11/25(土) 23:53:11
変態 C++コードが飛び交う現場なんて本当にあるんだろうか
0772デフォルトの名無しさん2006/11/26(日) 01:01:23
Boostの開発現場

実際にどこか1ヶ所にみんなが集まっているわけではないだろうけどね。
0773デフォルトの名無しさん2006/11/26(日) 01:45:04
正直More〜は立ち読みで十分な悪寒
0774デフォルトの名無しさん2006/11/26(日) 01:57:24
ちょっと質問。

hoge(aaa, "aaa"); を、HOGE(aaa) か HOGE("aaa") みたいに、
aaa を1度しか書かなくていいようにマクロ化したいんだけど、無理かな?

文字列連結とか # 連結マクロとか考えたけど思いつかず・・・
0775デフォルトの名無しさん2006/11/26(日) 01:58:58
>>774
#define HOGE(expr) hoge(expr, #expr)

これじゃ駄目なのか?
C++ 関係ないな。
0776デフォルトの名無しさん2006/11/26(日) 02:00:28
#define HOGE(aaa) hoge(aaa, #aaa)
0777デフォルトの名無しさん2006/11/26(日) 02:01:27
#define HOGE(x) hoge(x, #x)

それはこれで済む話か?
0778デフォルトの名無しさん2006/11/26(日) 02:05:07
774 の人気に嫉妬
07797742006/11/26(日) 02:09:45
a##b → ab のタイプの連結しか知らなかったです
ありがとうございました。

連結マクロでぐぐってもいいのが見つからなかったんですが、
これ何か名前ついていますか?
0780デフォルトの名無しさん2006/11/26(日) 02:21:31
>>779
# は連結じゃねーしマクロじゃない。文字列化演算子。
0781デフォルトの名無しさん2006/11/26(日) 02:25:06
みんなマクロが好きなんだね
そんなに好きならLispさんちの子になっていいんだよ
0782デフォルトの名無しさん2006/11/26(日) 02:29:18
>>774-781
この流れに和んだ
07837742006/11/26(日) 02:37:43
>>780
ありがとうございます、文字列化演算子#、トークン連結演算子## が見つかりました。
デバッグなどで、列挙体を表示するのに使いたかったのです。


#define HOGE(word) E_##word

enum TYPE {
 HOGE(aaa),
 HOGE(bbb),
};

#undef HOGE

#define HOGE(word) #word

static char* COMMAND[] =
{
 HOGE(aaa),
 HOGE(bbb),
};

こんな感じにやっといて、
HOGE(aaa) HOGE(bbb) の部分だけ別ファイルにして #include で取り込めばいいかなーと。
そうすれば、COMMAND[E_aaa] で "aaa" が取り出せるって寸法です。

後はスクリプトなどで、コマンド ⇔ ID の変換とか。
0784デフォルトの名無しさん2006/11/26(日) 02:41:44
>>783
常套手段だ。

× static char* COMMAND[] =
○ static char const* cons COMMAND[] =
■ このスレッドは過去ログ倉庫に格納されています