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


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

C++相談室 part39
501 名前:デフォルトの名無しさん :2005/03/24(木) 00:27:20
そういうこと気にしないといけないというのは、全てC++のちぐはぐさのせいなんだよね。
もうこの言語、限界なんじゃない?
言語仕様に対して無理しているように見える。

502 名前:デフォルトの名無しさん :2005/03/24(木) 00:42:59
>>501
随分前からそう言われてるけど、結局生き残ってるわけだ

503 名前:デフォルトの名無しさん :2005/03/24(木) 00:46:16
別に難しい仕様、使用しなければいいんじゃね?なんちて。

504 名前:デフォルトの名無しさん :2005/03/24(木) 00:50:17
そのうちシステムズプログラミングもC#やらDやらでやることになるんだろうか

505 名前:デフォルトの名無しさん :2005/03/24(木) 00:54:25
システムズプログラミングってなんですか

506 名前:デフォルトの名無しさん :2005/03/24(木) 00:55:15
アレだよ

507 名前:デフォルトの名無しさん :2005/03/24(木) 01:01:21
もうそろそろアセンブラから卒業する時代が来たんだよ。

508 名前:デフォルトの名無しさん :2005/03/24(木) 01:02:49
というわけで、OCamlがオススメだよ☆

509 名前:デフォルトの名無しさん :2005/03/24(木) 03:07:20
マネージコードをネイティブに実行できるCPUが作られれば、あながち
あり得ない話とも言えない。

510 名前:デフォルトの名無しさん :2005/03/24(木) 03:13:10
ハードウェアでガベージコレクションねぇ…

511 名前:デフォルトの名無しさん :2005/03/24(木) 03:17:54
>>510
ex. Lispマシン

512 名前:デフォルトの名無しさん :2005/03/24(木) 03:38:54
そういえば、Javaプロセッサって計画が昔あったよね

513 名前:デフォルトの名無しさん :2005/03/24(木) 09:55:25
教えてください。
メンバ関数の実体って、オブジェクトごとに確保されるのでしょうか?
staticメンバ関数というのがある以上、普通のメンバ関数はそういう
ことになると思えるのですが。でもどのオブジェクトでも処理としては
同じなのに、複数用意するのも変に思えるのです。せいぜいthisポインタが
指すオブジェクトが違うだけですよね。実際はどういう仕組みなのでしょうか?

514 名前:デフォルトの名無しさん :2005/03/24(木) 10:01:20
>>513
せいぜいthisポインタが違うだけなので、
一般的な実装ではthisポインタを引数に取る関数がひとつ生成される。
このため、非staticメンバ関数の型は宣言(見た目)どおりの型とは違う。

staticメンバ関数はthisポインタを受け取らないので、
宣言どおりの型を持つ関数が生成される。


515 名前:デフォルトの名無しさん :2005/03/24(木) 10:02:30
> せいぜいthisポインタが
> 指すオブジェクトが違うだけですよね。

これが大問題だと思うのは気のせいでしょうか?
メンバ変数がひとつもないのであれば、それこそstaticでいい

516 名前:デフォルトの名無しさん :2005/03/24(木) 10:36:30
thisポインタが違うのが問題ということでしょうか。
なんとなく、thisポインタだけを動的に差し替えてみたいな
感じでいけないのかなぁ・・・と思ったんですよね。
処理としては同じで対象が違うってことなので。
そういうわけにもいかんのですか。

517 名前:デフォルトの名無しさん :2005/03/24(木) 10:44:45
>>516
読解力ないな。
>514が書いているとおり、一般的にはthisを引き数として受け取る関数のように実装されるのだけどね。
つまり、オブジェクトごとに存在するのは(staticじゃない)メンバ変数と仮想化に必要なポインタのみ。
コンストラクタを含めて関数はオブジェクトごとに生成されるわけではない。

518 名前:デフォルトの名無しさん :2005/03/24(木) 10:49:43
class A {
public:
int i;
void func() { i = 0; }
};

A a;
a.func();

は、Cではこんな感じかな。

struct A {
int i;
};
void A_func(A* this) { this->i = 0; }

A a;
A_func(&a);

519 名前:513 :2005/03/24(木) 11:12:37
あ、失礼、なぜか514さんのレス読み飛ばしてました。
十分納得できました、どうもです。

520 名前:517≠514 :2005/03/24(木) 11:58:50
実際、旧いC++処理系はCのソースを生成していたから
まさしく>518のようなことをしていたと思われ。
#いや、関数名は型も含んだ長い名前になるけど。

今時のコンパイラはthisはスタックに積まずにレジスタで渡すなどしているから
厳密には違うんだろうけどね。

521 名前:デフォルトの名無しさん :2005/03/24(木) 12:26:15
メンバ関数でない単純なCの関数でも場合によってはレジスタで引数を渡すような最適化も存在するから大してかわってないとも言える。。

522 名前:デフォルトの名無しさん :2005/03/24(木) 15:08:13
ファイル分割の設計ってどういう思想でやってますか?
例えばクラスは、ヘッダファイルにインタフェース、実装ファイルに
実装、という様にわかりやすくできると思いますが、main関数の
実装ファイルにおいて、そういったインターフェースをどうやって
取り込むのか、グローバル変数の取り込み方とか、いろいろ悩むところが。
いろんなヘッダをまとめて取り込んだ代表ヘッダみたいなのを使う方法や、
依存関係を極力少なくした取り込み方もあると思いますが、何を基準に
判断していいのか・・・。それによってコンパイル速度とかも変わって
くるんでしょうか?




523 名前:デフォルトの名無しさん :2005/03/24(木) 15:18:18
>>522
C++で書かれたソースを公開しているフリーソフトウェアがいくらでもあるだろ。
そういうのを読むんだよ。
まずは真似ることからはじめようね。

524 名前:デフォルトの名無しさん :2005/03/24(木) 15:20:31
あとはオープンソースプロジェクトのコーディングガイドラインを読むのも参考になるかも

525 名前:522 :2005/03/24(木) 15:38:56
そうですか、オープンソースなるもので勉強するのですか。
すみませんが、勉強になるもので何か1つ適当なのを
紹介してもらえませんか?


526 名前:デフォルトの名無しさん :2005/03/24(木) 15:41:33
>>525
自分で探しな。
http://sourceforge.net/

527 名前:デフォルトの名無しさん :2005/03/24(木) 16:22:29
STLとかboostとかのソース読んでおもいっきし可読性の低いソースを書くようになる可能性について:

528 名前:デフォルトの名無しさん :2005/03/24(木) 16:24:51
ガワさえ綺麗なら中身なんて・・・

529 名前:デフォルトの名無しさん :2005/03/24(木) 16:36:09
>>527
可読性ってなんですか
おいしいですか?

530 名前:デフォルトの名無しさん :2005/03/24(木) 16:51:37
コンストラクタで例外が発生してがくがくぶるぶる。

531 名前:デフォルトの名無しさん :2005/03/24(木) 16:57:27
>>530
コンストラクタの気持ち…ちゃんと受け止めてあげましたか?

532 名前:デフォルトの名無しさん :2005/03/24(木) 16:58:20
>>530
恐がってはダメです。
前向きに、向き合っていかないと…
でないと…

533 名前:デフォルトの名無しさん :2005/03/24(木) 17:42:56
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[COS1345]             幻のソース   「どろソース」       
  兵庫・神戸  ========ソース(株) 


       ソースタンクの1番下で、どろどろとした、原料の野菜の旨みを吸い込
んだ
   「どろソース」は、一部のグルメにしか知られていなかった幻のソースです。
   
    ”そばめし”には欠かせないソースで、その他カレーの隠し味に、焼きそば・
お好み焼きや、他のソースと
    ブレンドしてトンカツやフライ系に幅広くご利用いただける万能調味料ソース
です。
    ピリリと辛く、その豊かな味わいは癖になります。


     360g ¥400− [0]本[かごに入れる]

534 名前:デフォルトの名無しさん :2005/03/24(木) 17:44:31
ある時例外の使い方に目覚めてから、コンストラクタで例外が起きても怖くなくなった。

535 名前:デフォルトの名無しさん :2005/03/24(木) 17:51:52
例外”前提”プログラミングはだめだぞ


536 名前:デフォルトの名無しさん :2005/03/24(木) 18:01:54
>>535
どういう意味?

537 名前:デフォルトの名無しさん :2005/03/24(木) 18:11:46
ここでcloseしなくてもこのタイミングで例外が飛んでくるから〜みたいなプログラム

538 名前:デフォルトの名無しさん :2005/03/24(木) 18:14:44
>>537
よく分からん。簡単なコード例を挙げてくれないか?

539 名前:デフォルトの名無しさん :2005/03/24(木) 18:20:56
>>535
Breakの変わりに使うことを推奨している言語もあるよ。
一概にそうとは言えない。

540 名前:デフォルトの名無しさん :2005/03/24(木) 18:22:15
例外という言葉に惑わされてはいけないよね。

541 名前:デフォルトの名無しさん :2005/03/24(木) 18:37:32
try {
  hoge.open(hage);
} catch(AlreadyOpenException e) {
  hoge.close();
  hoge.open(hage);
}


542 名前:デフォルトの名無しさん :2005/03/24(木) 18:39:26
>>539
どんな言語?興味アル

543 名前:デフォルトの名無しさん :2005/03/24(木) 18:40:03
>>541
サンクス。理解した。

544 名前:デフォルトの名無しさん :2005/03/24(木) 18:48:41
>>542
OCaml!!!!

545 名前:デフォルトの名無しさん :2005/03/24(木) 18:49:18
×変わり
○代わり
ね。

546 名前:デフォルトの名無しさん :2005/03/24(木) 20:40:50
オープンソースを見るときに、どのファイルにmain関数があるのかは
検索するしかないのでしょうか。

547 名前:デフォルトの名無しさん :2005/03/24(木) 20:42:03
検索してもいいし、書いてある場合もあるし、Doxygenファイルがくっついてる場合もある

548 名前:デフォルトの名無しさん :2005/03/24(木) 20:42:51
grepすりゃ一発でわかるだろ。

549 名前:デフォルトの名無しさん :2005/03/24(木) 20:46:56
移植性の確保のためにマクロ化されてたりするけどな

550 名前:デフォルトの名無しさん :2005/03/24(木) 20:57:56
まぁ、普通はファイル名で見当がつくけどな。

551 名前:デフォルトの名無しさん :2005/03/24(木) 22:40:25
>>550
どんなファイル名ですか?

552 名前:デフォルトの名無しさん :2005/03/24(木) 22:41:46
>>541
すみません、馬鹿なので理解できません
どの辺がいけないポイントなのでしょうか

553 名前:デフォルトの名無しさん :2005/03/24(木) 22:45:30
>>552
AlreadyOpenなんてしょっちゅうありえそうな事態だからちっともExceptionではない。

554 名前:デフォルトの名無しさん :2005/03/24(木) 22:53:09
エントリポイントがmain以外にされていたりするのは
単なる意地悪か何かでしょうかね。

555 名前:デフォルトの名無しさん :2005/03/24(木) 22:54:14
だから例外前提はダメなんでしょ?

556 名前:デフォルトの名無しさん :2005/03/24(木) 22:55:40
質問です。よろしくお願いします。

仕様コンパイラ:MinGW(mingw-jp-20040224.zip)
環境:WindowsXP SP2

char型とかは1バイトですよね?
http://www.bohyoh.com/CandCPP/FAQ/FAQ00046.html
ここによると符号付charは-127 〜 127 となっております。

しかし、例えば
char ch;

ch = 1024;
としても最大値を超える値が代入できてしまいます。
出力結果は無茶苦茶になりますが。
10進1024は2進で0111 1111 1111で、
char型が1バイトなら、最大値は2進で1111 1111だと思うのですが、
char型に1024を代入した場合、あふれた0111の部分はどこへ行ってしまうのでしょうか?

質問が少しわかりにくいかと思いますがよろしくお願いします。



557 名前:デフォルトの名無しさん :2005/03/24(木) 22:57:45
>>554
>>549ではなくて?

558 名前:デフォルトの名無しさん :2005/03/24(木) 22:59:39
>>556
桁あふれしてる分は消える。それだけ。
式があってれば代入は可能。その式に意味があるかどうかは
コンパイラの判断するところではない。プログラマが決めるとこ。
signed charの「有効な」値の範囲が-127 〜 127てだけ。

559 名前:デフォルトの名無しさん :2005/03/24(木) 23:03:59
>>556
あふれた部分は捨てられる。

signed charの範囲が-127〜127と言うのは規格が要求している最低限の値。
それ以上の範囲になっている事もありえる。(具体的には2の補数を使って-128〜127としている実装が多い)
自分のはどうなっているのか知りたければSCHAR_MAX/SCHAR_MINを読めばいい。

560 名前:デフォルトの名無しさん :2005/03/24(木) 23:04:03
>>556
> char ch;
> ch = 1024;
> としても最大値を超える値が代入できてしまいます。
> 出力結果は無茶苦茶になりますが。

それは代入できているとは言わないだろ。
あふれた場合、代入後の値は実装依存。

561 名前:デフォルトの名無しさん :2005/03/24(木) 23:04:53
>>558
それでは、有効な値を超えた場合、例えば
最大値が127なのに1000を代入した場合、
代入された変数には何が代入されるのですか?

char ch;
ch = 1000;
の場合chには1111 1111が代入されているのですか?

562 名前:デフォルトの名無しさん :2005/03/24(木) 23:05:49
そんな器用なことせんだろ
下位ビットが入るだけ(実装依存?)

563 名前:560 :2005/03/24(木) 23:06:19
>>558-559
かぶった。

・・・と思ったら、
「桁あふれしてる分は消える。それだけ。」?
「あふれた部分は捨てられる」?
そんなルール決まってんの?「実装依存」じゃなくて?

564 名前:デフォルトの名無しさん :2005/03/24(木) 23:09:43
実装依存はMinGWの場合の振る舞い等はどの辺を読めば書いてありますか?

565 名前:デフォルトの名無しさん :2005/03/24(木) 23:11:35
>>564
コード書いて試せばいいじゃん

>>563
char hoge[4];
hoge[1] = 10000;
とかなら捨てられないと困らない?

566 名前:デフォルトの名無しさん :2005/03/24(木) 23:13:43
定義されてるかどうかと言われれば、されてないだろうなあ。
>>562の言うように、下位ビットが入るだけ。
CPUでの実際の演算がレジスタで行われていることを考えれば、
有効なビット幅をメモりにストアすると考えるのが普通。

567 名前:デフォルトの名無しさん :2005/03/24(木) 23:14:18
>>561-564
1000(DEC) = 3E8(HEX)
だから
char = 8bit の場合は E8
char = 9bit の場合は 1E8
char = 12bit の場合は 3E8
が入る。


568 名前:560 :2005/03/24(木) 23:16:07
>>565
捨てられようが捨てられまいが、
代入しようとした値と結果の値が同じにならない時点で困る。
そのコードで「捨てられる」のなら困らないってこと?

569 名前:デフォルトの名無しさん :2005/03/24(木) 23:16:43
その話はつまんないからおしまい

570 名前:デフォルトの名無しさん :2005/03/24(木) 23:19:35
>>569
君にはむずかしすぎたかな?^^;

571 名前:デフォルトの名無しさん :2005/03/24(木) 23:19:45
>>568
他の領域まで書き込まれちゃ変数の単位の区切りなんて意味なくなるじゃん
(char)1で代入するなら上位ビットを0で埋めるというより、下位ビットを代入するだけだと思うけど


572 名前:デフォルトの名無しさん :2005/03/24(木) 23:20:42
JIS X3010:2003
6.5 式
6.5.16 代入式
6.5.16.1 単純代入
(略)
意味規則 単純代入は,右オペランドの値を代入式の型に型変換し,左オペランドで指し示されるオブジェクトに格納されている値をこの値で置き換える。

6.3 型変換
6.3.1 算術オペランド
6.3.1.3 符号付き整数型及び符合無し整数型 整数型の値を_Bool型以外の他の整数型に変換する場合,その値が新しい型で表現可能な場合,値は変化しない。
 新しい型で表現できない場合,新しい型が符合無し整数型であれば(略)
 そうでない場合,すなわち,新しい型が符号付き整数型であって,値がその型で表現できない場合は,結果が処理系定義の値となるか,または処理系定義のシグナルを生成するかのいずれかとする。

573 名前:デフォルトの名無しさん :2005/03/24(木) 23:20:59
>>570
いや、レベルが低すぎ。
このすれ以前にも益してレベル下がってる。


574 名前:デフォルトの名無しさん :2005/03/24(木) 23:21:31
>>568
>「代入しようとした値と結果の値が同じにならない時点で困る。」
そもそも桁あふれする値を入れて「結果が違う」なんて言うのは糞プログラマ。
hoge[1] = 10000; で「捨てられ」無かった場合どうなるか。
ヘタするとhoge[0]やhoge[2]が上書きされる。困るだろ。

575 名前:572 :2005/03/24(木) 23:26:56
しまった。ここはC++だった OTL

576 名前:デフォルトの名無しさん :2005/03/24(木) 23:27:20
ttp://www.kuzbass.ru/docs/isocpp/conv.html#conv.integral
範囲に収まらない整数型への変換では
・変換先が符号無しなら収まらないビットを切り捨て
・変換先が符号有りなら実装定義
ということになるらしい。

char の場合は符号の有る無しが実装定義なので、
char に収まらない値を代入した結果は
実装定義ということになる。

577 名前:560 :2005/03/24(木) 23:34:48
>>574
なんで配列を持ち出してきたんだろうと思ってたら、そういう意味か。
「捨てられない」=「どこかに書き込まれる」なんて思ってなかったから意味がわからなかった。
代入先以外の変数まで触られちゃ困る。当たり前だ。

578 名前:デフォルトの名無しさん :2005/03/24(木) 23:39:01
検査の結果 >>560 はCPUの仕組みを分かってないことが判明しました。


579 名前:デフォルトの名無しさん :2005/03/24(木) 23:39:14
intもcharもchar[4]も実際に消費するメモリ量は同じだっけ?(32bitマシンの場合)

580 名前:デフォルトの名無しさん :2005/03/24(木) 23:40:40
>>579
俺んところはそうなっているみたいだ。

581 名前:デフォルトの名無しさん :2005/03/24(木) 23:41:31
>>579
struct a {
int b;
char c;
char d;
char e;
char f;
char g[4];
} h;


582 名前:デフォルトの名無しさん :2005/03/24(木) 23:42:51
>>579
そういう実装が多いね。

583 名前:デフォルトの名無しさん :2005/03/24(木) 23:44:16
>>581
structならそらちゃうだろな

584 名前:デフォルトの名無しさん :2005/03/24(木) 23:46:40
>>573
そのわりにはちゃんと理解してる人や、
今再確認にした人が多いみたいだね。

585 名前:560 :2005/03/24(木) 23:46:41
>>578
そんなことは無いぞ。
言語の規格とCPUの仕組みをごっちゃにしないように。

586 名前:デフォルトの名無しさん :2005/03/24(木) 23:49:11
typedef union tag {
char hoge_c[8000];
int hoge_i[2000];
double hoge[1000];
} MICCHIRI;

無駄がない。鯖で試そうと思ったけど何と無くやめておいたネタ。


587 名前:デフォルトの名無しさん :2005/03/24(木) 23:50:02
桁溢れが起きると例外を発生するようにしてほしいよね。
そう思わない?
ところで、ボクはCPUとは無関係だと思うなぁ、ハハハ

588 名前:デフォルトの名無しさん :2005/03/24(木) 23:57:40
言語の規格とCPUの仕組みは完全には分離できないよ。
特にCでは。最適化を考慮して、アセンブラにどう展開
されるかを考えてプログラムするだろ、Cの場合。

589 名前:デフォルトの名無しさん :2005/03/25(金) 00:02:42
>>588
> 特にCでは。最適化を考慮して、アセンブラにどう展開
> されるかを考えてプログラムするだろ、Cの場合。

しない

590 名前:デフォルトの名無しさん :2005/03/25(金) 00:06:56
>>588 ごっちゃにしないように。

591 名前:デフォルトの名無しさん :2005/03/25(金) 00:07:46
>>589
マジっすか。

592 名前:デフォルトの名無しさん :2005/03/25(金) 00:08:29
>589
しない? 漏れは結構考えるけど。

ところで今は何が争点になっているのやら。

593 名前:デフォルトの名無しさん :2005/03/25(金) 00:09:31
>特にCでは。最適化を考慮して、アセンブラにどう展開
>されるかを考えてプログラム

しないだろ。そんな事考えなくちゃいけない環境なら最初からアセンブラ使うでしょ

594 名前:デフォルトの名無しさん :2005/03/25(金) 00:14:31
>593
いやそこまで厳密にどうアセンブラに展開されるかを考えるんじゃなくて(それなら直接アセンブラで書く)、
アルゴリズムとかを考えるとき、どうすればアセンブラに落としたときに
効率のいいコードになるかとか考えたりしない?

CPUの命令の種類とか、メモリのキャッシュとか、C言語から直接は見えないけど
透かして見て考えるくらいならできるでしょ。

595 名前:デフォルトの名無しさん :2005/03/25(金) 00:15:57
SSEやらを使うときは考えるけど、
あからさまに効率が悪いコードを書かなければ、
最近はコンパイラの最適化の方が優秀な希ガス

596 名前:デフォルトの名無しさん :2005/03/25(金) 00:32:11
>>595
うむ、だから「最適化を考慮して」と言ったんだ。
最適化がうまくいくようにコードをかく。

597 名前:デフォルトの名無しさん :2005/03/25(金) 00:38:38
>>596
それはCPU等のハードウェアを透かして見ていると言えるのかな。

598 名前:デフォルトの名無しさん :2005/03/25(金) 00:44:08
>>596
「最適化がうまくいくように」は言語の規格を意識するべき話だろう。
「アセンブラにどう展開されるか」はCPUの仕組みを意識するべき話だろう。
まぁ、つまりは >>590

599 名前:デフォルトの名無しさん :2005/03/25(金) 00:46:42
そこまで処理の重さが気になるコードなんてそんなに書く?
書くとしてもインラインアセンブラ使うと思うんだが

600 名前:デフォルトの名無しさん :2005/03/25(金) 00:47:17
おまいらたまには女性を意識した格好をしてくださいよ。

601 名前:デフォルトの名無しさん :2005/03/25(金) 00:56:34
速度がいらないならC++という選択肢はないし
そうでなくても普段から速度を意識してしまうのは病気みたいなもんだ

602 名前:デフォルトの名無しさん :2005/03/25(金) 01:18:52
糞言語使っているなら兎も角、C++で書くときに単純なループを
0との比較は最適化されやすいからという理由でカウントダウンループになんぞしない。

#こういう8bitCPU時代のノウハウを得意げに語る携帯Javaプログラマはうざい。

603 名前:デフォルトの名無しさん :2005/03/25(金) 01:20:38
時代が変わったんだ!オールドタイプは失せろ!

604 名前:デフォルトの名無しさん :2005/03/25(金) 01:21:42
ハイハイ、CPUもアセンブラも分からないオコチャマはおねんねしましょうネ

605 名前:デフォルトの名無しさん :2005/03/25(金) 01:28:32
今でも0との比較って速いの?

606 名前:デフォルトの名無しさん :2005/03/25(金) 01:31:38
>>605
速いかどうかは兎も角、命令語長が短くなるとKVM使いがほざいてた。

真っ当なコンパイラならもし速くなるのなら最適化でそう言うコードを吐くべきだし、
プログラマはそんなことに頓着する必要はない。

607 名前:デフォルトの名無しさん :2005/03/25(金) 04:36:10
>556
>10進1024は2進で0111 1111 1111で、

|・ω・`) どうしても誰もコレをつっこまないの?

608 名前:デフォルトの名無しさん :2005/03/25(金) 05:36:24
>>607
書いた本人です。
0100 0000 0000ですね。
ポカミスです。

609 名前:デフォルトの名無しさん :2005/03/25(金) 07:06:50
>>607
焦点がそこじゃないから気づかなかった・・・

610 名前:デフォルトの名無しさん :2005/03/25(金) 07:25:10
自作自演だからじゃないのか?

611 名前:デフォルトの名無しさん :2005/03/25(金) 08:57:56
本質じゃないから放置した。

612 名前:デフォルトの名無しさん :2005/03/25(金) 14:07:30
Visual Studio 2005からOpenMP対応でしょ。
コンパイラが並列処理最適化ができるようにforループを書かないならないよ。

613 名前:デフォルトの名無しさん :2005/03/25(金) 16:24:34
その辺、Intelのコンパイラと統一してくれるとうれしいんだよな
とは言いつつ自分はIntelのコンパイラを使い続けるんだろうけど

614 名前:デフォルトの名無しさん :2005/03/25(金) 16:28:41
サンデープログラムに高級な最適化なんていらん

615 名前:デフォルトの名無しさん :2005/03/25(金) 22:16:54
>>605
RISC 系の CPU だとゼロレジスタ持ってるから、多少は速くなると思われ。
0 以外の数字だと、レジスタにその数字をセットする命令が必要になる。

もっとも、そんなところで速度稼いでも大局的には意味はないと思うが。

616 名前:デフォルトの名無しさん :2005/03/25(金) 22:18:06
C++/CLIの話題はどこですればいいんでしょ

617 名前:デフォルトの名無しさん :2005/03/25(金) 22:34:12
>>616
微妙。ここか、

managed C++ やろうぜ!!
http://pc8.2ch.net/test/read.cgi/tech/1014486422/

か、

【初心者歓迎】C/C++室 Ver.15【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1111231578/

か…

618 名前:デフォルトの名無しさん :2005/03/25(金) 22:56:58
managedじゃない?

619 名前:616 :2005/03/25(金) 22:58:24
>>617
>>618
ありがとうです。のぞいてみます

620 名前:デフォルトの名無しさん :2005/03/25(金) 23:13:28
ManagerがModuleA/B/Cを管理しているとして、
それぞれを別クラスCMgr/CModuleA/B/Cとします。
CMgrはメンバにCModuleA/B/Cのインスタンスを持っています。
普通はCMgrから各モジュールに命令します。
でも、諸事情でModule同士で直接やりとりしたいのですが、
どのようにすればよいのでしょうか?
CModuleAのメンバ変数にCModuleB、CModuleBのメンバ変数にCModuleAを
定義すると当然ながらコンパイルエラーになってしまいます。
どう解決するのでしょうか?
(C++というかモジュール化の問題?)


621 名前:デフォルトの名無しさん :2005/03/25(金) 23:15:47
>>620
Manager経由で通信するってのはダメなの?

622 名前:デフォルトの名無しさん :2005/03/25(金) 23:17:41
>>620
ポインタを持てば?前方宣言して

623 名前:デフォルトの名無しさん :2005/03/25(金) 23:28:40
>>620
相互に参照する必要があるなら、公開するメンバ関数のみをインタフェイスとして

class IModuleA {
public:
virtual int foo() = 0;
};

のように分離して、CModuleA はそれから派生させて実装を追加するという手も定番。

CMgr には IModuleA* GetA() { return &m_moduleA;} みたいなのを追加して、
CModuleB などからはこれで得たインタフェイス経由でCModuleAのインスタンスを
操作する。

624 名前:620 :2005/03/25(金) 23:51:38
>>621
Module固有のIFをMgrに入れるのは避けたいので、、、

>>622
なるほどポインタならOKですね。
すいません、実体しか試してませんでした。
でも、これってModuleAはModuleBのクラス定義を全て
インクルードするんですよね?
publicしかアクセスできないとはいえ気持ち悪いなぁ。。。
C→C++変換をしてるんですが、
Cではモジュール毎に外部公開ヘッダと内部用ヘッダに分けてました。
C++だと両方をクラス定義に押し込んで外部ヘッダはPublicに
内部用はPlivateと考えています。

>>623
これだとIModuleAのヘッダだけのインクルードで済むんで嬉しいんですが、
CMgrにGetAを追加するのが、気になりますねぇ。。。


625 名前:デフォルトの名無しさん :2005/03/26(土) 15:13:28
A a;
B b;
C c;
D* d = new (a, b, c) D;
このようにnewした場合、対応するdeleteはどのようになるのでしょうか。
d->~D();
D::operator delete(d, a, b, c);
といちいち書く必要があるんですか?

626 名前:デフォルトの名無しさん :2005/03/26(土) 15:26:07
こうなる
% rm src.cpp

627 名前:624 :2005/03/26(土) 15:51:38
ないということで自己解決しました。

>626
参考になりました。どうもありがとうございます。

628 名前:625 :2005/03/26(土) 15:52:30
>627
すいません。624ではなく625でした。

629 名前:デフォルトの名無しさん :2005/03/26(土) 16:34:16
>>626
# rm -rf /

630 名前:デフォルトの名無しさん :2005/03/26(土) 19:16:50
>>625
ここはC++のスレです

631 名前:デフォルトの名無しさん :2005/03/26(土) 19:39:54
>>625
それ、なんて言語?

632 名前:デフォルトの名無しさん :2005/03/26(土) 19:57:36
>>630-631
世界バカ発見!

633 名前:630 :2005/03/26(土) 20:12:03
煽ってはみたものの不安になってきた。

D* d = new (a, b, c) D;

こんな構文あったっけ?

634 名前:デフォルトの名無しさん :2005/03/26(土) 20:35:35
>>633
placement new

635 名前:デフォルトの名無しさん :2005/03/26(土) 20:43:24
void* operator new(std::size_t, A&, B&, C&);

636 名前:630 :2005/03/26(土) 20:44:53
ご め ん な さ い

637 名前:デフォルトの名無しさん :2005/03/26(土) 21:18:36
new D(a,b,c)との違いが分からない

638 名前:デフォルトの名無しさん :2005/03/26(土) 21:24:41
A* a = new (b, c, d) A(e, f, g);
簡単に言うと、これはoperator new(sizeof(A), b, c, d)でメモリを確保し
A(e, f, g)を用いてオブジェクトを作っている

639 名前:デフォルトの名無しさん :2005/03/26(土) 21:39:46
つまりnewの引数とコンストラクタの引数に分かれてるわけかthx

640 名前:デフォルトの名無しさん :2005/03/27(日) 01:44:49
STLの本読んでたら
T& map::operator [] (const key_type& key)
この演算は
(*((insert( make_pair(x, T()) )).first)).second
に等しいとあったのですが、これって納得できますか?
まず、mapで[]演算子を使うと、キーが同じものがない場合は
強制的に挿入されるということなので、pair型を作ってinsert
に行きますよね。それはいいのですが、insertが返すのは挿入した
要素の位置(反復子)ですよね。それに対して.firstってできる?
pair型そのものじゃなくて、反復子に対して.firstとやることって
できるんですか?またその.firstで何を得てさらに間接参照して
.secondで何を得るのかいまいちわからんのです(まぁ普通に考えれば
最終的には要素の値(キーではなく)のリファレンスを取得するので
しょうけど・・・)

641 名前:デフォルトの名無しさん :2005/03/27(日) 01:48:13
その形式のinsertが返すのはpair<iterator, bool>。

642 名前:デフォルトの名無しさん :2005/03/27(日) 02:00:02
OH!
そうなんですか。
それでガテンがいきますね。
メンバ関数ではないinsertがポイントなんですね。
どうもです。



643 名前:デフォルトの名無しさん :2005/03/27(日) 02:35:00
>>642
分かってないだろ。

644 名前:デフォルトの名無しさん :2005/03/27(日) 02:58:24
あ、メンバ関数ですね、map仕様のinsertということですね、しっけい


645 名前:デフォルトの名無しさん :2005/03/27(日) 03:36:12
>>644
一歩前進

646 名前:デフォルトの名無しさん :2005/03/27(日) 03:53:13
正常にコンパイル/リンクが通っているソースなのですが
下記の一文を追加するとコンパイルは通りますがリンクエラーがでまくります。
(runtime_errorクラスが使えません)

throw std::runtime_error("TEST");


環境は Vine Linux2.6 gcc-2.95.3-2vl22

メッセージmain.o: In function `main':
main.o(.text+0xd3): undefined reference to `runtime_error::runtime_error(basic_string<char, string_char_traits<char>, __default_alloc_template<true, 0> > const &)'
main.o: In function `__malloc_alloc_template<0>::_S_oom_malloc(unsigned int)':
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x1a): undefined reference to `endl(ostream &)'
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x27): undefined reference to `cerr'
main.o(.__malloc_alloc_template<0>::gnu.linkonce.t._S_oom_malloc(unsigned int)+0x2c): undefined reference to `ostream::operator<<(char const *)'
長いので略

リンクオプションは特になにも設定せずデフォルトのままですが
これがまずいのでしょうか。

647 名前:デフォルトの名無しさん :2005/03/27(日) 04:14:55
つい最近、Unixスレでほぼ同じ理由によるエラーの質問があったな。

ま、ここは環境依存スレじゃないんで。

648 名前:デフォルトの名無しさん :2005/03/27(日) 06:24:25
>>647 -lstdc++ つけたらうまく行きました。ありがとうございました。

649 名前:デフォルトの名無しさん :2005/03/27(日) 16:00:57
>>645
incrementedかとおもたよ

650 名前:デフォルトの名無しさん :2005/03/28(月) 09:14:55
hppはヘッダファイルのc++版でよいの?

651 名前:デフォルトの名無しさん :2005/03/28(月) 11:30:51
>>650
いい。別に.hでも支障ないけど。

652 名前:デフォルトの名無しさん :2005/03/28(月) 13:04:43
bool型の配列変数hairetu[5]の中で、どれか1つでもtrueであれば処理を行いたいのですが、

if(hairetu[0,1,2,3,4,5] == true){
処理;
}

というのは不可能でしょうか?やはりfor文で一つ一つチェック?
また、同じくbool型の変数hairetu[5]を一括でfalseにするには、
hairetu[]=false;
hairetu[0,1,2,3,4,5]=false;
といったかき方はダメでしょうか?

初心者のくせに大きめのプログラムを構築しているもので、
コンパイルして実行できないんです。教えていただけません?

653 名前:デフォルトの名無しさん :2005/03/28(月) 13:09:14
>>652
その書き方は×
STLのfindとfill使えばいいのでは

654 名前:デフォルトの名無しさん :2005/03/28(月) 13:11:28
>>652
>というのは不可能でしょうか。
不可能

>やはりfor文で一つ一つチェック?
for文でも&&でずらずら並べるでも好きな様に。

>といったかき方はダメでしょうか?
ダメ。

>教えていただけません?
ません。

655 名前:デフォルトの名無しさん :2005/03/28(月) 13:12:10
>>653
早速のレスありがとうございます。
findを使って構文を書き直しておきました。
一大ミスにつながるところでした^^;

656 名前:デフォルトの名無しさん :2005/03/28(月) 13:25:52
>>655
仮令大きなプログラムの一部を書いているのでも、小さな単位で確認する習慣をつけるべき。
まさか、机上コーディングしているわけじゃなかろ?

657 名前:デフォルトの名無しさん :2005/03/28(月) 14:38:12
hairetuでいいかarrayにすべきかここで議論

658 名前:デフォルトの名無しさん :2005/03/28(月) 15:16:37
while

659 名前:655 :2005/03/28(月) 17:42:58
>>656
はい、これからそうします。

>>657
いやあくまで例ですから・・・´Д`;

660 名前:デフォルトの名無しさん :2005/03/28(月) 18:36:45
>652
それ以前にC++の基本的な文法を覚えるのが先じゃないのか?
>hairetu[0,1,2,3,4,5]
こんなのあり得ないし

661 名前:デフォルトの名無しさん :2005/03/28(月) 18:39:28
>>660
別に文法的に間違ってはいないけどな
hairetu[5]と同義になるだけだけど

662 名前:デフォルトの名無しさん :2005/03/28(月) 18:39:52
危ないから目を合わせてはいけません

663 名前:デフォルトの名無しさん :2005/03/28(月) 19:00:44
>>662
世界バカ発見!

664 名前:デフォルトの名無しさん :2005/03/28(月) 19:17:12
struct A{ char data[4]; };
struct B{ char data[4];
virtual B~(){} };
仮想関数がないクラスをnewしても
メモリ確保されてないんだがなぜ?
(最適化されてるからかな?)
new A[1000000];//メモリ消費しない
new B[1000000];//メモリ消費する


665 名前:デフォルトの名無しさん :2005/03/28(月) 19:18:35
最適化オフで試してみたか?

666 名前:デフォルトの名無しさん :2005/03/28(月) 19:24:05
バーロー

667 名前:デフォルトの名無しさん :2005/03/28(月) 19:29:15
>>664
メモリへの書き込みがあるまではメモリが増えない、という
実装になってるんじゃないかと。

668 名前:デフォルトの名無しさん :2005/03/28(月) 19:49:45
>>661
…コンマ演算子の詳細を忘れていたよ。サンクス

669 名前:デフォルトの名無しさん :2005/03/28(月) 20:11:02
質問です。
英語ソフトの日本語化でハマっているものです。

・こちらの開発環境はMS社のVC++ Ver6 日本語版。
・英語版のソースは海外の開発元から頂いております。
・私はVCもCもほとんど触ったことがありません。

ボタンやメニュー上の英語は、フォント名の変更と日本語名称の入れ替えでなんとかなりました。
しかし、印刷の日本語が文字化けしてしまい、上手くいきません。この部分が質問です。

フォント名の指定は日本語も通るように「MSゴシック」に変更しました。印刷上でもフォント名の変更が反映されました。
日本語名称の入れ替えた部分は、見事に文字化けになっています。

考えられる問題点を教えて頂きたいのですが。

自分なりに疑いのありそうな部分を並べますと。
・インストーラ形式で作成していないので、コアらしきexeファイルの
 入れ替えのみで日本語化している。(DLL等も入れ替えないとダメ?
・変数の指定が二バイト文字を受け付けない。(そんなことがありえ
 るのか全く知りません..
・1バイト文字しか通過できない何かがまだ隠されている。
・開発環境が間違っている。

何方か、アドバイスいただければ幸いです。
よろしくお願いします。

670 名前:664 :2005/03/28(月) 20:20:27
>>665,667
VC6最適化なしRelease ->増加なし
VC6最適化なしDebug ->増加
667の通りかも、

これだと頻繁アクセスする時だとvirtual使うデメリット大きいなぁ.....
でもどのタイミングで確保されるんだろう?
頻繁に使うときはvirtualの方がいいってケースもありうるかも


671 名前:670 :2005/03/28(月) 20:21:50
× これだと頻繁アクセスする時だとvirtual使うデメリット大きいなぁ.....
○ これだと頻繁アクセスしない時だとvirtual使うデメリット大きいなぁ.....


672 名前:デフォルトの名無しさん :2005/03/28(月) 20:33:06
>これだと頻繁アクセスしない時だとvirtual使うデメリット大きいなぁ.....
デメリットは無い

>頻繁に使うときはvirtualの方がいいってケースもありうるかも
そんなケースは無い

673 名前:デフォルトの名無しさん :2005/03/28(月) 21:12:37
>>670
>でもどのタイミングで確保されるんだろう?

メモリにアクセスしたとき。
仮想関数があるBはvtableへのアドレスを設定するため、newするときに各要素にアクセスがある。
デバッグが有効だと未初期化のメモリは0xCDCDCDCDで埋めるコードが生成されるので
どちらもアクセスがある。

newが実際にメモリ確保に使ってるHeapAllocはアドレスだけ予約して、物理メモリをマッピングしてないっぽい。
で実際アクセスがあったときに物理メモリを割り当てる、と。

674 名前:デフォルトの名無しさん :2005/03/28(月) 21:44:59
>664
newしてメモリが確保されていないってどうやって確認したの?

675 名前:デフォルトの名無しさん :2005/03/28(月) 21:50:10
>>669
スレ違い。
そもそも説明が冗長で肝腎な情報が抜けている。

676 名前:デフォルトの名無しさん :2005/03/28(月) 22:25:47
>>669
>何方か、アドバイスいただければ幸いです。
・C/C++未経験者が他言語へのポートをする事がそもそも間違い。
・Windows 自体の知識も怪しい。
・ていうか、スレ違い。
煽ってるわけではなく、マジで。

677 名前:669 :2005/03/28(月) 23:02:33
>>675さん >>676さん
すいません。

GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。
Web系でCやPerl、PHPを少々触れていたのですが、場違いだったようです。
この件、自分もタッチしたくなかったのが本音ですが、緊急事態で助けを求められたもので..。
明日、自分なりにもう少し頑張ってみます。
ありがとうございます。

678 名前:669 :2005/03/28(月) 23:04:35
うーん..。
> GUI環境は、MS社の開発環境はVBをちょっとかじった程度でした。
GUI環境は、MS社のVBをちょっとかじった程度でした。
駄目だこりゃ。

679 名前:675 :2005/03/28(月) 23:58:38
>>678
スレ違いだからこれ以上は避けるが、最後に一言。
>669を読んで、何を印刷しようとしているのか判る?
こちらはどんなプログラムか、どんなデータを扱うのか、何を印刷するのか何もわからない。
それでアドバイスができると思う?

680 名前:デフォルトの名無しさん :2005/03/29(火) 00:25:39
リソースの言語を日本語にしてからMSゴチとかの設定にする

681 名前:デフォルトの名無しさん :2005/03/29(火) 02:34:41
シリアライズで質問があります。

共通の基底クラスを持つ A, B, C などのクラスがあって、ファイルに保存したり
読み込んだりしようと思いました。

そこで、保存する時にクラス名を先頭に書き込んでおいて、読み込むときには
クラス名をキーにして、それぞれのクラスの static な読み込み関数のポインタを
得るマップを作って、それで生成しています。

でも、これだと新しいクラスを追加した時に、先ほどのマップに別の場所で登録
しなければならなくて、なんとなくいやな感じです。

こういうことをもっとスマートにできる方法は、無いのでしょうか?

682 名前:デフォルトの名無しさん :2005/03/29(火) 02:57:30
boost::serializationでも使ってみてはどうだろうか。

683 名前:デフォルトの名無しさん :2005/03/29(火) 02:58:32
とりあえずBoost.Serializationでも読んでみる。

684 名前:681 :2005/03/29(火) 03:13:50
>>682-683
ありがとうございます。今から読んでみます。

685 名前:681 :2005/03/29(火) 05:58:27
>>682-683
試してみましたが、すごい便利ですね。
STL のコンテナに対応して、派生クラスの面倒も見てくれるので、
えらくすっきりしそうです。

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

686 名前:デフォルトの名無しさん :2005/03/29(火) 09:39:24
staticなメンバ関数で、さらにそれを仮想関数にするなどという
テクニックもありですよね?

687 名前:デフォルトの名無しさん :2005/03/29(火) 09:48:40
なし

688 名前:デフォルトの名無しさん :2005/03/29(火) 10:21:18
ttp://www.ksky.ne.jp/~seahorse/cpp/staticvirtual.html

689 名前:デフォルトの名無しさん :2005/03/29(火) 13:16:51
クラスのメンバ変数って、コンストラクタで特に初期化しなかった場合、
例えばメンバにクラスをもっていたら、デフォルトコンストラクタで
初期化されるんでしたよね?でも組み込み型は、未初期化のようなんですが、
デフォルトで初期化されるのはクラス型のメンバだけということでいいので
しょうか?


690 名前:デフォルトの名無しさん :2005/03/29(火) 14:07:36
コンパイルエラーで、
>dllimport 関数 の定義は許されません。
これが表示されたときにもっとも疑うものはなんですか?

691 名前:デフォルトの名無しさん :2005/03/29(火) 14:13:37


692 名前:デフォルトの名無しさん :2005/03/29(火) 14:15:27
>>691
言われると思った。
それで、なんですか?

693 名前:デフォルトの名無しさん :2005/03/29(火) 14:21:17
>>692
dllimportはDLLからその関数の定義を読み込むって意味だから
自身のソースで関数を定義すると多重定義になるんでは?

694 名前:デフォルトの名無しさん :2005/03/29(火) 14:48:56
>>690
dllexportとdllimportを切り替えるマクロの不備。

695 名前:デフォルトの名無しさん :2005/03/29(火) 15:05:59
>689
いいのです

696 名前:デフォルトの名無しさん :2005/03/29(火) 15:56:31
>>695
スルーされたと思いきや、どうもです

697 名前:デフォルトの名無しさん :2005/03/29(火) 17:20:56
クラスのアクセス指定子に関して今まで物凄い誤解をしていたかもしれないのですが、
それも某HPに次のような説明があったためです。

public継承
親のpublicメンバ ---> 子のpublicメンバ
親のprotectedメンバ ---> 子のprotectedメンバ
親のprivateメンバ ---> 子のprivateメンバ

protected継承
親のpublicメンバ ---> 子のprotectedメンバ
親のprotectedメンバ ---> 子のprotectedメンバ
親のprivateメンバ ---> 子のprivateメンバ

private継承(デフォルト)
親のpublicメンバ ---> 子のprivateメンバ
親のprotectedメンバ ---> 子のprivateメンバ
親のprivateメンバ ---> 子のprivateメンバ

これをぱっと見て、あぁなるほどね、と最初は思ったのですが、
ものすごい誤解ではないですか?


698 名前:デフォルトの名無しさん :2005/03/29(火) 18:38:52
>697
親のprivateメンバ → 子からアクセスできない

699 名前:デフォルトの名無しさん :2005/03/29(火) 19:53:35 ID:
やはりそうですよねぇ

700 名前:669 :2005/03/29(火) 20:56:01
>>680さん
ありがとうございます。
お陰さまで、印刷上でも日本語化できました。

キャラクターセットのシフトJISが鍵だったようです。
十数年ぶりのc++、開発環境に慣れるまでが面倒でした。
あとは力作業のみ。

701 名前:デフォルトの名無しさん :2005/03/30(水) 01:51:25
ある可変引数のグローバルC関数があります。
ラッパークラスのメソッドを経由してこのグローバルC関数を呼び出したいのですが、
このさい、ラッパークラス側のメソッドは、呼び出される側と同じインタフェースの可変引数にした
いと思っています。ソース公開されているので、呼び出される側のグローバルC関数の方を弄っ
て(vfprintfのように)va_list引数にすれば実現可能なのはわかっているのですが、呼び出される
側に一切手を加えずに、このようなことを実現はできますか。
オーバロード関数を死ぬほど用意するとか、そういうのは無しで。
スタックフレームに依存したコードで、ポータビリティはなくなってもかまいません。(redhat linux)

702 名前:デフォルトの名無しさん :2005/03/30(水) 02:00:44
何回か同じ意図の質問は見たことがある
定番のやりとりが嫌だから、俺は回答を書かないけど

703 名前:デフォルトの名無しさん :2005/03/30(水) 03:15:31
>>701
自分の環境でのvfprintfの実装を参考にしてください。
環境非依存の方法はありません。

704 名前:デフォルトの名無しさん :2005/03/30(水) 03:22:36
それでも一応書いとくか。
Cスレの過去ログ倉庫で、最近の方から順番に検索すれば
概ね実現可能な方法が見つかると思うよ。
もちろん、そのまま渡せる引数の最大個数等は
コンパイル時に決定されちゃうけどね。

705 名前:デフォルトの名無しさん :2005/03/30(水) 05:57:59
インラインアセンブラ使ってごにょごにょとか

706 名前:デフォルトの名無しさん :2005/03/30(水) 08:56:14
>703,704
サンクス。
かなり面倒くさそうですが、
勉強のため調べてみます。

707 名前:デフォルトの名無しさん :2005/03/30(水) 10:09:46
VC++でクラス内のメンバ関数呼び出すと、スタックフレーム上の戻りアドレスの
前に4バイト分オブジェクトインスタンスだかなんだかのポインタが入るけど、
ここら辺の資料どっかない?構造体が知りたいんだけど。

708 名前:デフォルトの名無しさん :2005/03/30(水) 11:21:33
構造体?

709 名前:デフォルトの名無しさん :2005/03/30(水) 11:33:11
クラスメソッドならthisポインタ入ってるの当たり前じゃないか?

710 名前:デフォルトの名無しさん :2005/03/30(水) 12:54:11
分からない事があるので、質問です。

if(m_Heap.find(Text)!=m_Heap.end()){
return(true);
}
else{
return(false);
}

VC++.NETのSTLのMapを用いて上記のソースを記述したのですが、
trueが返る筈の場所でfalseが帰ってしまいます。
で、トレース実行してみたところ

if(m_Heap.find(Text)!=m_Heap.end()){
(1)return(true);
}
else{
(2)return(false);
}

と、何故か実行されるステートメントの矢印が移動します。
こんな事は、普通ありえないと思うのですが何か原因があるのでしょうか?

711 名前:デフォルトの名無しさん :2005/03/30(水) 13:05:34
>>710
ステップデバッグの正常な動き。
自分で似たコードを書いて、returnしたときにどこに矢印がいくか調べてみれば?

712 名前:デフォルトの名無しさん :2005/03/30(水) 13:16:23
ところで、その動作だったら
return m_Heap.count(Text);
のほうが良いと思う。

713 名前:デフォルトの名無しさん :2005/03/30(水) 15:09:53
>>710
矢印の動きが腑に落ちないなら、最適化が切られていることを確認した上でリビルドしてみ。
あと、スレ違い。

714 名前:デフォルトの名無しさん :2005/03/30(水) 21:22:06
>>705
リンカ使って、static メンバ関数のシンボルを C 関数の別名扱いに
するとか。思い切り処理系依存だが。

715 名前:デフォルトの名無しさん :2005/03/31(木) 00:32:43
>>707
ATLのソースでも見てみよ。とエスパーしてみる。

716 名前:デフォルトの名無しさん :2005/03/31(木) 01:39:42
>>715
>>709に答えが出てるわけだが

717 名前:デフォルトの名無しさん :2005/03/31(木) 01:45:41
>>715
ATLなんて糞みてーなライブラリのソースなんて見ても何の価値もなし


718 名前:デフォルトの名無しさん :2005/03/31(木) 02:10:45
文字列初期化の時、どれが正しいのでしょうか

char *a="hoge";
char a[]="hoge";
char a[]={'h','o','g','e','\0'};

719 名前:デフォルトの名無しさん :2005/03/31(木) 02:14:07
配列とポインタについて勉強しろ。
せめてC FAQは読め。

720 名前:デフォルトの名無しさん :2005/03/31(木) 02:14:11
>>718
・一番目はポインタであり、それ以外は配列である。
・2番目と3番目は同じ。

721 名前:デフォルトの名無しさん :2005/03/31(木) 02:15:03
2番目と3番目は同義
初期化だけならどれでも問題ない
どう使うかによる

722 名前:デフォルトの名無しさん :2005/03/31(木) 02:17:02
つまらない質問に答えてくれて
ありがとうございました

723 名前:デフォルトの名無しさん :2005/03/31(木) 02:52:58
CStringArrayに入っている文字列を"\n"で連結して一つの文字列にしたいのですが、
どうやればいいのでしょうか?


724 名前:デフォルトの名無しさん :2005/03/31(木) 03:03:55
あの〜すれちがいですけど...

725 名前:デフォルトの名無しさん :2005/03/31(木) 03:09:29
はぁ?

726 名前:デフォルトの名無しさん :2005/03/31(木) 04:10:45
つまらない質問なんですけど、
一度も呼び出される事のない関数をコンパイラの判断で
省いてくれる(実行形式ファイルにコードとして含まれない)
ような事ってあるんですか。

構造体のメンバ変数を呼び出すのと、メンバごとに分割した
変数を使用するのとでは、できあがるファイルは同じになりますか。
(例えば、pos.x;pos.yをpos_x pos_yのように分割する。)

int length = str.length;のようにメンバ変数を直接、読み出すのと、
int length = str.getlength();のように、単に単一の変数をメンバ関数か
らreturn length;
のように値を返すのは同じバイナリを吐き出しますか。

727 名前:デフォルトの名無しさん :2005/03/31(木) 04:26:48
>>726
インラインでない限りcall命令は省かれることないと思うけど
今のコンパイラはまだそこまで頭良くないと思う

728 名前:デフォルトの名無しさん :2005/03/31(木) 04:33:58
>>726
最後のお題は関数に inline を付けるか
コンパイルオプションで設定すれば
おそらく同じバイナリだな

あと真ん中の例は分かりにくいからもう少し詳しく

729 名前:デフォルトの名無しさん :2005/03/31(木) 04:36:40
早くしないとネムネム...

730 名前:デフォルトの名無しさん :2005/03/31(木) 04:42:12
どこからも参照されていない関数をリンクしない機能というのは少なくともVC++のリンカにはある。
ttp://www.microsoft.com/japan/developer/library/vccore/_core_.2f.opt.htm

731 名前:デフォルトの名無しさん :2005/03/31(木) 05:00:34
>>730
俺知らんかったよ
背のビーして人にアバドイスするもんじゃないね
反省、反省


732 名前:デフォルトの名無しさん :2005/03/31(木) 08:46:08
>>726です。

みなさんお答え頂きまして有難う御座います。

真ん中のは、構造体内の変数にアクセスする時に、わざわざ
オフセットを加えたりしないのかという事です。

staticやautoの構造体の場合は、その手間は必要ないのでは
ないかということです。
(ポインタの場合でも同様なのか良く分かりません)

。。つまらないとこ拘ってすいません。。

あと、struct pos[500000];/*int x;int yがメンバ*/
とかした場合には、int pos_x[500000]int pos_y[500000]
とかするよりCPUのメモリのキャッシュヒットが良いかもしれないと
かどうとか、どこかに書かれていた記憶があります。

なんか混乱してきた

733 名前:デフォルトの名無しさん :2005/03/31(木) 09:03:41
>>732
構造体に纏めるか纏めないか、ということかな?
具体例を書いてくれると判りやすいのだが。
struct Pos {int x; int y;};として、
Pos pos;

int pos_x; int pos_y;

Pos.x = 0; Pos.y = 0;

pos_x = 0; pos_y = 0;
のように使うなら全くといっていいほど同じコードになる筈。

Pos pos[10000];

int pos_x[10000]; int pos_y[10000];
の場合、ループ内でx, y を同時に使用するなら確かにキャッシュヒット的には構造体の方が有利。

つーか、C++の場合、構造体化することによって様様なコンストラクタを用意したり、
ちょっとしたハンドリング用のメンバ関数を用意するなどの便利さを重視するべきかも。

734 名前:デフォルトの名無しさん :2005/03/31(木) 09:14:41
>>732
そういうレベルが気になるならこんなとこで質問してないでアセンブラの読み方覚えてコンパイラが吐いたコード眺めたほうがはやい。
どのみち状況とコンパイラ次第なんだから。

735 名前:デフォルトの名無しさん :2005/03/31(木) 09:17:46
>>733さん有難う御座います。
言いたかったのはそういうことです。

やはり同じコードになってくれるんですね。
(なってくれなかったりしたら嫌だなと思いまして書かせていただ
きました。)

利便性とか隠蔽とか(環境によってはコード補完とかも?)も考えた
ら素直にメンバ関数使うべきみたいですね。

736 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 00:45:46
>718が普通にスルーされてるが、まずいんじゃないのか?
(一応720とかに書いてあるけどさ)

ポインタと配列なのでsizeofの結果が違うことと、ポインタの方はconstな
文字列を指してるんで変更できない。

int main(int argc,char** argv){
 char *a="hogehoge";
 char b[]="hogehoge";
 
 //a[1]='a'; //これをやると環境にもよるがSegmentation fault
 b[1]='a';
 
 printf("a - %d %s\n",sizeof(a),a);
 printf("b - %d %s\n",sizeof(b),b);
}

> ./a.exe
a - 4 hogehoge
b - 9 hagehoge


737 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 00:57:03
ってか、春休みでなきゃ「初心者スレに逝け」で済まされる質問だし。

738 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 01:27:26
『プログラミング言語C++』を絶版にするらしいね。

739 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 01:35:23
っていうか、ひとりのレスだけを鵜呑みにして信じちゃって良いのか?
いや、ケチつけんじゃなくてマジでさ。

740 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 12:24:19
皇紀じゃつまんないな。
他の板はいろいろバリエーションあるのに。

741 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 12:37:30
>>740
ム板なだけに、エポック秒で表示しろってか?

742 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 14:52:26
>>741
それいいね、酸性
管理人にリクエストすれば良かった

743 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 16:41:07
16進表記がいいんじゃないか?

744 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 16:46:52
皇記2665/04/01(金)16:45:02
皇記A69/04/01(金)10:2D:02
皇記101001101001/100/01(金)10000:101101:10


745 名前:デフォルトの名無しさん :皇紀2665/04/01(金) 18:04:31
read.cgiの負荷を考えなければ、datにエポック秒で持っていれば
2ch用ブラウザとかで好き放題表示変更できるのにな。


746 名前:デフォルトの名無しさん :int 2ch =05/04/01(金) 21:40:59
なぜ割り込み

747 名前:デフォルトの名無しさん :int 2ch =05/04/01(金) 21:59:23
>int 2ch =05/04/01(金) 21:40:59

int
まず有り得ない。char使うとしても""が足りない。

2ch
変数名の先頭に数字は使えない。


全角。超有り得ない。なでしこでも使ってろピザ

748 名前:デフォルトの名無しさん :int 2ch =05/04/01(金) 22:06:07
せめてtime_tの方がふいんき(なぜかryが出るだろうに。

749 名前:デフォルトの名無しさん :int 2ch =05/04/01(金) 22:18:14
もまえらDOSのシステムコールしらなすぎ。

750 名前:デフォルトの名無しさん :int 2ch =05/04/01(金) 22:19:28
>>749
int 21h 最強!


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