C++相談室 part56
..
564:デフォルトの名無しさん
07/09/10 07:42:42
>>552
5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."
でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."
"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?
565:デフォルトの名無しさん
07/09/10 10:43:59
C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。
[void*]を[整数型]として考える
566:デフォルトの名無しさん
07/09/10 10:56:38
>>564
それだ! 凄いわ。ありがとう。
567:デフォルトの名無しさん
07/09/10 11:03:16
人権擁護委員会が在日を擁護する時
URLリンク(www.kajisoku-f-2.com)
URLリンク(www.kajisoku-f-2.com)
568:デフォルトの名無しさん
07/09/11 11:27:29
質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、
以下のようなコードを書きました。
//using namespace std;
//hoge pHoge = new hoge();
//pHogeList.push_back(pHoge);
list<hoge*>::iterator it = pHogeList.begin();
while(it != pHogeList.end()){
if (/*消滅条件が整ったら*/){
delete *it;
*it = NULL;
}
it++;
}
pHogeList.remove(NULL);
しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。
双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか?
このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?
569:デフォルトの名無しさん
07/09/11 12:01:45
実際にどこが遅いのかを特定するところから始めたらどうだ
570:デフォルトの名無しさん
07/09/11 21:41:35
C++の話じゃないかもしれないけど、C++で書いてるので質問させてください
0x00と"\x00"って何が違うんですか?
571:デフォルトの名無しさん
07/09/11 21:44:53
>>570
数値と文字(列)の違い
572:デフォルトの名無しさん
07/09/11 22:01:11
std::cout << typeid(0x00).name() << std::endl;
std::cout << typeid("\0x00").name() << std::endl;
573:デフォルトの名無しさん
07/09/11 22:13:32
文字は整数です。
574:デフォルトの名無しさん
07/09/11 23:16:31
仮に0x00と'\x00'の違いだったとしたら、
C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。
575:デフォルトの名無しさん
07/09/12 00:32:31
おお、知らなかった。C++だと文字リテラル
(この用語自体C++からみたいだけど)はcharなのね。
576:デフォルトの名無しさん
07/09/12 01:03:12
理由は演算子多重定義の都合。
IOストリーム作っていたときにそうすべきと感じたそう。
D&Eに書いてある。
577:デフォルトの名無しさん
07/09/12 03:26:38
"\x00" == { 0x0, 0x0 }
578:デフォルトの名無しさん
07/09/12 03:40:04
ノ| ,ノ|
( 0x0)b
ノ| ,ノ|
(; 0x0)a
579:デフォルトの名無しさん
07/09/12 19:55:32
>>575
int だったり wchar_t だったりもするけど
580:デフォルトの名無しさん
07/09/12 21:41:34
質問よろしいでしょうか?
/* main.cpp */
#inlucde "test.h"
main()
{
int a=1,b=2;
inlinetest(a,b);
}
/* test.h */
inline void inlinetest(int x,int y);
/* test.cpp */
#inlucde "test.h"
inline void inlinetest(int x,int y)
{
return;
}
上記の具合にinline関数を使おうとすると
「未定義のシンボル」とコンパイルエラーがでてしまいました。
inlineの使い方が間違っているのでしょうか?
ご指南お願いいたします。
581:デフォルトの名無しさん
07/09/12 21:55:52
> inlineの使い方が間違っているのでしょうか
そうです。
582:デフォルトの名無しさん
07/09/12 23:14:20
>>580
#inlucde
これは試したソースではちゃんとしてるんだろうか?
583:デフォルトの名無しさん
07/09/12 23:20:50
インライン関数は、普通ヘッダに定義を書く。
584:デフォルトの名無しさん
07/09/12 23:24:30
>>580
inline関数はその呼び出された場所に展開されることが前提になりますから、
呼び出し元でその定義が分かるようにしなければなりません。
したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。
>>580の場合は、test.hで定義するのが適当かと思います。
585:580
07/09/12 23:40:58
明快に理解できました。
頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。
丁寧な説明ありがとうございます。
586:デフォルトの名無しさん
07/09/12 23:53:53
寧ろ、inlineなんかは積極的に使わずにコンパイラの最適化に任せた方がいいと思うが。
587:register
07/09/12 23:56:06
おいらのこともたまには思い出してくれないか?
588:デフォルトの名無しさん
07/09/13 00:25:43
>>587
そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど
K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な
最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。
589:デフォルトの名無しさん
07/09/13 16:50:41
初期化された const T[] がROM化可能な領域に配置されるのは
昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。
プロセス間で場合共有可能なページという感じで。
590:,588
07/09/13 21:06:23
なんか趣旨が伝わりにくい文章ですが、要するにregisterもconstもに多様な位置づけだよね、ってことです。
591:デフォルトの名無しさん
07/09/13 22:26:55
>>590
いいえ。
592:デフォルトの名無しさん
07/09/13 23:33:35
それはトムです。
593:デフォルトの名無しさん
07/09/13 23:43:15
tomcat
594:デフォルトの名無しさん
07/09/14 00:01:10
わろた
595:デフォルトの名無しさん
07/09/14 00:03:35
べ、別にわろてなんかいません!勘違いしないでください!
596:デフォルトの名無しさん
07/09/14 11:29:42
トムも仏も無い
597:デフォルトの名無しさん
07/09/15 19:56:06
ところで作りかけのソースあっぷしたら虐めてくれますか?
598:デフォルトの名無しさん
07/09/15 21:39:52
うん
599:デフォルトの名無しさん
07/09/17 03:19:16
あるテキストファイルを行の順番を逆にして出力したいんだけど、
スマートなやり方が思いつきません。
今は
vector<string> str;
テキストファイルから1行読み込み
str.push_back(読み込んだ文字列);
for(int i=str.size()-1;i>=0;i--) cout << str[i] <<endl;
こうしてるんだけど、これだとファイルが数百MByte以上になったときにバッファを大量に食うので避けたい。
打開策として、インプットファイルを終端からReadするって手があるのですが、
これ以外でいい方法はありませんか?
600:デフォルトの名無しさん
07/09/17 03:29:23
ファイルを分割して読み込む
601:599
07/09/17 03:41:50
>>600
あーなるほど!
それも一つの手ですね!
602:599
07/09/17 04:01:35
>>600
お礼を言い忘れました。
どうもありがとうございました。
603:デフォルトの名無しさん
07/09/17 05:15:30
あとはまぁ、行頭位置のインデックスを作るとか。
元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、
あとは好きな行を取り出せる。
同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、
そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。
604:デフォルトの名無しさん
07/09/17 07:14:59
数百MB単位のファイル読むときはちゃんとmemory mapped file使おうぜ。
このスレの範疇からは外れるが。
605:デフォルトの名無しさん
07/09/17 08:23:03
>>604
でもさ、>>599の場合だと、
結局は、一度は最初から最後まで全部読み込まないといけないことには変わりないし、
先頭から読んでいくのと違いあるのかな。
普通のモダンなOSはディスクアクセスから予測した先読みのキャッシュぐらいあるだろうし
606:デフォルトの名無しさん
07/09/17 09:16:07
つ[tail -r]
607:デフォルトの名無しさん
07/09/17 12:10:29
$ tail -r
tail: オプションが違います -- r
詳しくは `tail --help' を実行して下さい.
608:デフォルトの名無しさん
07/09/17 13:31:44
つか、テキストファイルを逆順に表示する必要があるのか?
609:デフォルトの名無しさん
07/09/17 13:34:05
実用的な場面はあまりないかもしれないけど、言語の勉強のための課題としては
手ごろな内容なんじゃないかな。
610:デフォルトの名無しさん
07/09/17 13:35:00
tail -f /var/log/messages でいいでね?
611:デフォルトの名無しさん
07/09/17 14:05:18
馬鹿はすっこんでろ
612:デフォルトの名無しさん
07/09/17 14:18:17
言語の勉強ならなぜにstd::vectorを使う?
613:デフォルトの名無しさん
07/09/17 14:26:42
C++の勉強ならSTLが適当だろう。C++スレだし
614:デフォルトの名無しさん
07/09/17 14:32:09
勉強が目的なんでしょ?
615:デフォルトの名無しさん
07/09/17 14:35:55
「言語文法の勉強」って限定してないなら標準ライブラリの使用法も範疇だろ
616:デフォルトの名無しさん
07/09/17 15:17:22
c++の質問じゃないかもしれないけど
0x00000F00
こってどういう意味なんでしょうか?
16進法かなと思うんですが
617:デフォルトの名無しさん
07/09/17 15:27:26
明らかにC++じゃないしプログラムの質問でもないぞ
0x00000F00は10進数の3840だ。
618:デフォルトの名無しさん
07/09/17 15:29:33
.
619:デフォルトの名無しさん
07/09/17 15:31:05
>>616 数値のリテラルを16進数で書きたいときの書き方。
その数値自体の意味までは判らんよ。
620:デフォルトの名無しさん
07/09/17 15:37:41
3840ってことはF00ってことでおk?
621:デフォルトの名無しさん
07/09/17 15:39:47
>>620
何がOKかさっぱりわからん。3840(10)=F00(16)ってだけだ。
わからんならWindows標準の電卓でも使ってくれ。
622:デフォルトの名無しさん
07/09/17 15:44:17
>>617
一応C++の質問になるなじゃない?
CやC++など一部の言語では16進数を表記する文法として0x〜を採用しているだけで、
一般的に16進数を0x〜と表記するという規則はないでしょ。
623:デフォルトの名無しさん
07/09/17 15:50:12
いやー、どこの言語でも0xか\xのプリフィックスが付いたら
16進数だと思うけど。
624:デフォルトの名無しさん
07/09/17 15:56:26
"0x"が仮にC++特有だとしてもそれ以降はただの16進数だしな
625:デフォルトの名無しさん
07/09/17 15:58:36
数字の混ざったトークンにa - fが入ってたら接頭子がなんであれ16進と解釈できるだろ。
626:599
07/09/17 16:00:52
>>603-615
どうも、ありがとうございました。
勉強になります。
学校の課題とかではないです(私はもう学生ではないので…)
株と為替の時系列データを処理するプログラムを書いているのですが、
データの入手先によって、系列の時間が上り順のものと下り順のものの2種類あるので、
一方を並べ替えることで1つの書式にそろえようとしたわけです。
627:デフォルトの名無しさん
07/09/17 16:04:36
>>625
17進数〜36進数という可能性も。
628:デフォルトの名無しさん
07/09/17 16:13:47
1バイト文字コードなら256進数までありうる
629:デフォルトの名無しさん
07/09/17 16:52:10
>>616
死ね
630:デフォルトの名無しさん
07/09/17 16:57:01
そこは気を利かせて
0xDEAD
とか書かないと
631:デフォルトの名無しさん
07/09/17 17:01:14
>>630
0xDEAD=57005
実はお前さんの書き込み時間は、57分00.5秒だったのでは…
632:デフォルトの名無しさん
07/09/17 17:29:46
0xDEADBEEF
633:デフォルトの名無しさん
07/09/17 19:23:11
0xBADCAFFE
634:デフォルトの名無しさん
07/09/18 19:51:52
0xBACA
635:デフォルトの名無しさん
07/09/18 19:54:44
0xCPLASPLASDEOOPRASIIKODEWOKAKUNIHADOUSUREBAIIDAROUKA
636:デフォルトの名無しさん
07/09/18 20:19:58
どうせなら CPLUSPLUS ってかけよ
637:デフォルトの名無しさん
07/09/18 20:21:27
>>635
C++はマルチパラダイム言語だ。そんな意味のない目標は捨てて身軽になろう。
OOPなんて所詮たくさんある道具の内の一つに過ぎない。
638:デフォルトの名無しさん
07/09/18 20:25:01
>>636
気づかなかったわ
>>637
okそうするよ
639:デフォルトの名無しさん
07/09/18 22:36:41
そういやどっかのサイトにあったけど、「OOPは呼び出し元を再利用するための手法の一つ」
というのはかなり納得した。特にC++のはそうだよな。
640:デフォルトの名無しさん
07/09/18 22:40:04
定義なんぞどうでもいい
641:デフォルトの名無しさん
07/09/18 22:43:20
定義?定義じゃネーヨ
概念だろ
642:デフォルトの名無しさん
07/09/19 00:03:17
テンプレート関数にテンプレートクラスを渡したいのですが、可能でしょうか
具体的には
std::list<int> a;
std::list<double> b;
func( a );
func( b );
のようにしたいです
643:642
07/09/19 00:12:49
自己解決しました
644:デフォルトの名無しさん
07/09/19 00:17:08
template <typename T> void func(std::list<T> x)
{
};
こんな感じ?
645:デフォルトの名無しさん
07/09/19 00:17:59
そんなちょっと考えたら解決するようなことをいちいち・・・
646:デフォルトの名無しさん
07/09/19 00:30:38
馬鹿だからなんだぜ?
647:デフォルトの名無しさん
07/09/19 12:05:47
KODE
648:デフォルトの名無しさん
07/09/19 12:15:12
氷結しよっ!
649:デフォルトの名無しさん
07/09/19 12:43:44
>>639
それはOOPっていうか、古くは各種アプリのプラグイン(DLL)に始まる
インタフェイス抽象とかコンポーネント化とかの特徴のような気が・・・
650:デフォルトの名無しさん
07/09/19 20:34:13
>>649
それは呼び出される側の再利用でなくて?
651:デフォルトの名無しさん
07/09/19 21:28:47
今ポインタの宿題をしていて 数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?
652:デフォルトの名無しさん
07/09/19 21:48:45
その質問を訊く身にもなってください。
今流行りのアスペルガーですか?
653:デフォルトの名無しさん
07/09/19 21:48:59
意味がわからんし、C言語スレへ池
654:デフォルトの名無しさん
07/09/19 21:49:31
俺に免じて許してやってくれ。彼は5歳なんだ。
655:デフォルトの名無しさん
07/09/19 21:54:15
俺アスペルガーだけどこんな奴と一緒にしないで欲しい
656:デフォルトの名無しさん
07/09/20 05:03:48
「数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?」
とはどういういみですか?
657:デフォルトの名無しさん
07/09/20 05:09:02
数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?
What abhorring is of of display of the value before it executes it by the guy of
exchanging numerical values it?
憎悪が交換数値の奴でそれを実行する前の価値の表示のものであること、それ?
(゚Д゚)?
658:デフォルトの名無しさん
07/09/20 06:20:59
>>651
お前があほという意味じゃ
659:デフォルトの名無しさん
07/09/20 07:09:57
ある仮想関数が、メンバ変数を書き換えないと想定されている場合、constを付けた方がいいんでしょうか?
例えばこんな感じ↓
class A {
public:
virtual int GetX() const = 0;
};
class B : public A {
public:
virtual int GetX() const { return x_; }
private:
int x_;
};
const A*型を使う場面があるのかが気になります。
660:デフォルトの名無しさん
07/09/20 07:20:55
>>659 そうですね。
661:デフォルトの名無しさん
07/09/20 07:31:21
>>659
つけられるconstは全てつけるべき。
非constである必要ができたら、非const版を追加するかconstを外すか熟考すべし。
662:659
07/09/20 07:36:33
ありがとうございます。
663:kkptcnZciZ
07/09/20 12:34:39
KOMUgI <a href="URLリンク(vunuddokfscm.com) [url=URLリンク(pliwysnvpdex.com) [link=URLリンク(uquzjkpzhomt.com) URLリンク(hukythasnspn.com)
664:マターリ ◆AbENcvTP5o
07/09/20 14:27:35
いきなりですみませんがこのスレに協力してくれる人を探しています。
スレリンク(entrance2板)l50
665:デフォルトの名無しさん
07/09/20 14:57:12
>>664
マルチすんな。
666:デフォルトの名無しさん
07/09/20 15:16:10
>>650
ん?
プラグインやインタフェイス抽象は主として呼び出す側の再利用に繋がると思うけど。
呼び出される方の利用の仕方がまちまちだと、
呼び出す側はいちいちそれに合わせなくてはならないわけだけど、
インタフェイスや呼び出し規約(API)という形に抽象化し共通化しておくことによって、
呼び出し側を変更せずに機能を追加してゆくことができる。
もちろん呼び出される側を再利用する仕組みでもあるんだけど、
呼び出される側の再利用だけのためであれば単にAPI公開で十分なわけで。
667:デフォルトの名無しさん
07/09/20 16:37:16
template<class T> class A
{
public:
void (A<T>::*func)();
};
template<class T> class B
{
public:
static void (B<T>::*func)();
};
template<class T> void (B<T>::*B<T>::func)() = NULL;
template<class T, class U> class C
{
public:
void (U::*func)();
};
template<class T, class U> class D
{
public:
static void (U::*func)();
};
template<class T, class U> void (D<T, U>::*U::func)() = NULL;
クラスDのようにしたいんですけど、どなたかわかる方いませんか?
Visual Studio2005 SP1
668:デフォルトの名無しさん
07/09/20 16:38:31
ちなみにクラスD以外はビルドOKです
669:デフォルトの名無しさん
07/09/20 16:49:48
template<class T, class U> class D
{
public:
static void (U::*func)();
};
template<class T, class U> void (U::*D<T, U>::func)() = NULL;
こうだろ?
670:デフォルトの名無しさん
07/09/20 17:19:20
うぉ、ビルドとおった〜
ありがとう!!
昨日からずっと考えてたよ。
671:デフォルトの名無しさん
07/09/20 18:48:48
横からごめん
template<class T, class U> void (U::*D<T, U>::func)() = NULL;
ってどういう意味?
672:デフォルトの名無しさん
07/09/20 19:04:46
>>671
単なる、staticなメンバー変数funcの定義だよ。
NULLで初期化してるだけ。
673:デフォルトの名無しさん
07/09/20 19:05:53
void (U::*)() 型のstaticメンバ変数 D<T, U>::func を定義して NULL で初期化している
674:デフォルトの名無しさん
07/09/20 20:44:48
最近某入力デバイス共有ソフトのソースと某モデリングソフトのプラグインサンプルのソースと
見る機会があったんだけど
そのどっちも、どう考えても継承ツリーの最底辺、絶対継承されっこないし実際されてない
javaだったらfinalがついてもおかしくないクラスのメンバで
継承元の仮想関数をオーバーライドしている関数にvirtualがついてた
薄々感じてはいたんだけどどんな状況でもオーバーライドした関数にはその目印にvirtualをつけるっていう
暗黙のコーディングルール(というかおまじない?)のようなのが流行してるのかな?
それともvirtual修飾子の意味をほとんどの人が誤解している?
675:デフォルトの名無しさん
07/09/20 20:51:49
かなり昔から流行ってるよね。
676:デフォルトの名無しさん
07/09/20 20:56:41
C#のvirtual, overrideキーワードを見るよろし
677:デフォルトの名無しさん
07/09/20 20:58:33
>>676
C# なんか存在しない頃から流行ってるよね。
678:デフォルトの名無しさん
07/09/20 21:24:07
別にはやってないだろ
679:デフォルトの名無しさん
07/09/20 21:26:07
文法的にはどっちでもいいんだっけ?
680:デフォルトの名無しさん
07/09/20 21:27:37
多分継承元のクラスから関数宣言コピペして、面倒だからvirtual削除してないだけだろ。
681:デフォルトの名無しさん
07/09/20 21:40:33
virtualつけてもoverrideかどうかは分からない
ということに最近気づいた
682:デフォルトの名無しさん
07/09/20 21:41:32
overrideする側はvirtual要らないんだっけ
俺はいつもコメントにoverrideって書くけど
C#がうらやましいぜ
683:デフォルトの名無しさん
07/09/20 21:53:43
基本クラスがvirtualなら十分でそれ以降は任意だったと思うがドキュメントが出てこない。
継承が深くなるとvirtualかどうか確認するのにいくつもヘッダーファイルを遡ることになるから、
overrideしたところにもvirtualがあるとわかりやすい。
いま基本クラスと書いたが途中からvirtualっていうのもありなんだよな。
#include <iostream>
using namespace std;
class A { public: void Say() { cout << "hello A" << endl; }};
class B : public A { public: virtual void Say() { cout << "hello B" << endl; }};
class C : public B { public: void Say() { cout << "hello C" << endl; }};
int main(){
A *a = new C(); a->Say();
B *b = new C(); b->Say();
return 0;}
結果
hello A
hello C
684:デフォルトの名無しさん
07/09/20 21:59:49
一度virtual付ければ後は無くておk。
俺はドキュメントなんか鼻から探すつもりもありませんがw
685:デフォルトの名無しさん
07/09/20 22:01:01
あ、でもvirtualはいつも付けてる。
理由は>>683と一緒。
686:デフォルトの名無しさん
07/09/20 22:01:12
sealedが欲しい。途中から隠蔽w
687:デフォルトの名無しさん
07/09/20 22:06:18
#define public protected
688:デフォルトの名無しさん
07/09/20 22:26:15
とにかく、C#なんかより前から流行ってるよね。
689:デフォルトの名無しさん
07/09/20 22:35:25
>>686
sealedは継承禁止じゃね?
690:デフォルトの名無しさん
07/09/20 22:36:54
void func(const T& param)
{
T.Hoge();
}
っておかしい?
型Tは何かわからないからそのメソッドHoge()を呼ぶのはおかしい?
691:デフォルトの名無しさん
07/09/20 22:37:32
void func(const T& param)
{
param.Hoge();
}
の間違いでした
692:デフォルトの名無しさん
07/09/20 22:38:24
継承される事を前提に作ってないクラスはデフォルトでsealed(final)
って仕様だとうれしいんだけど
小規模で作ってる分にはいらないけどさ
693:デフォルトの名無しさん
07/09/20 22:42:09
大規模開発なら「派生型を作らないこと」とドキュメントに書けばいいような・・・
オープンソース物みたいにソースがドキュメントって感じのだと、
そういう言語によるディレクティブは役に立つとは思うけど。
694:デフォルトの名無しさん
07/09/20 22:56:14
>>689
メソッドに対するシールド。
class A { public virtual void Say() { .. ; }}
class B : A { public override sealed void Say() { .. ; }}
695:デフォルトの名無しさん
07/09/20 23:03:45
>>694
それ上書き禁止で隠蔽とはいわないんじゃねーかと。
696:デフォルトの名無しさん
07/09/20 23:09:03
>>695
やりたいことはこうよ。
class A { virtual F
class B : A { sealed F // Aに対するoverrideだが、この後の継承は上書き扱い(非virtual)になる。
697:デフォルトの名無しさん
07/09/20 23:10:36
こんなのはどうだっけ?
class A { public: void a() {}; };
class B : public A { public: template<typename> void a(); /*not implement*/ };
698:デフォルトの名無しさん
07/09/20 23:13:04
>>696
それは隠蔽とは言わんだろ。
AやBにキャストしたら そのまま使えるんだし。
Javaだと覆い隠し(shadowed)とか言ってるような。
699:デフォルトの名無しさん
07/09/20 23:18:46
目印なんだったらコメント使えばいいのになんでそれをトークン使って
プログラムそのものを変質させてしまう形でやってしまうのだろう
いったい誰がこんな風習を広めたのか気になって眠れない
700:デフォルトの名無しさん
07/09/20 23:19:09
>>672
ぁーなるほど。
void (U::*)()の、D<T,U>::funcを。ってことね。
了解しますた。さんくす
701:デフォルトの名無しさん
07/09/20 23:19:49
>>698
C#だとこれのことを隠蔽と言うだけどね。VBだとShadows。
sealedといったのは例えが悪かった。このnewがC++に欲しいという話。
class A { public virtual void Say() { .. ; }}
class B : A { public override void Say() { .. ; }}
class C : B { public new void Say() { .. ; }}
702:デフォルトの名無しさん
07/09/20 23:20:25
>>690-691
問題ない。
もしTがメンバHogeを持っていなければ、エラーになる。
それなんて動的言語と言いたいところだが、
そこはC++なんでコンパイルエラー。
703:デフォルトの名無しさん
07/09/20 23:43:21
>>701
悪い、それ隠蔽だわ。カプセル化の文脈で出てくるデータ隠蔽と勘違いしてた。
704:デフォルトの名無しさん
07/09/20 23:58:00
>>703
死ね
705:デフォルトの名無しさん
07/09/21 00:28:53
>>702
サンキュ
706:fIIPJstQwl
07/09/22 03:23:44
zghXa7 <a href="URLリンク(www.pic.ucla.edu) cock</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) cocks</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) dick</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) dicks</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) naturals</a>
[URL=URLリンク(www.pic.ucla.edu)
707:デフォルトの名無しさん
07/09/22 06:54:59
void func(int n)
{
void *a = (void*)new char[n];
/*...*/
delete[] (char*)a;
}
これってメモリリークを起こさずにうまく開放されるんでしょうか?
708:デフォルトの名無しさん
07/09/22 06:57:27
日本語がおかしい。
メモリリークは開放処理を試みた後に発生する。
709:Kusakabe Youichi
07/09/22 07:16:59
710:デフォルトの名無しさん
07/09/22 10:27:23
>>707
途中で例外が投げられてfuncを抜けるなどといった事態が起これば、
メモリリークするね。
711:デフォルトの名無しさん
07/09/22 11:06:37
間違って
スレリンク(tech板:770番)
に書き込んでしまいました。
宜しくお願いします。
712:デフォルトの名無しさん
07/09/22 11:22:09
お断りします
713:デフォルトの名無しさん
07/09/22 12:05:23
>>661
>つけられるconstは全てつけるべき。
自分が読んだ本ではconst使いましょうという感じだったので
今までconst使っていたのですが、会社でconstを使うなといわれました。
const推奨派とconst禁止派みたいなのがあるのでしょうか?
714:デフォルトの名無しさん
07/09/22 12:18:58
「(たまたま)変更されてない」って理由でつけると結局あとでconst外しまくる羽目になる。
「(概念や仕様から考えて)変更しない」って理由でつけるべき
715:デフォルトの名無しさん
07/09/22 12:23:08
外しまくる羽目になってでも現在付けられるものは
全部付けた方が分かりやすいという考え方もある。
716:デフォルトの名無しさん
07/09/22 12:34:26
>>713
const禁止とかどれだけ低脳なんだwww
取り合えず禁止になりうる理由として考えられるのは、
・API等に非constポインタを渡す必要があり、キャストの排除が最優先ルール
・クラスのconstメンバ関数にコンストラクタで代入できない
(↑もちろんメンバ変数の初期化は代入じゃなく初期化子並びを使うべきだが
C転向者が多くて教育コストがかかる)
・宣言が長くなるのでちょっと読みにくくなる
・メンバ関数の適切なconst指定も必要になってくるが、C転向(以下略
・既に非constで作り上げてしまった社内ライブラリを作り直せない。
・論理バグはコーディング工程で見付ける(コンパイルえらー)のではなく、
デバッグ工程で評価チームが見付けるものとして
スケジュールやら人員配分やらが組まれていて直せない。
・上位の人が勉強嫌い
717:デフォルトの名無しさん
07/09/22 12:39:23
>>711
実際にはnew[]するときに、sizeof (T) * 要素数よりも
もう少し余分に確保されている可能性がある。
主にデストラクタを呼ぶ回数を記録するため。
もちろん、delete[]ではそれも含めて解放される。
718:NXRoXAzeEmJXNM
07/09/22 12:50:13
IpHLIP <a href="URLリンク(www.pic.ucla.edu) nipples</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) tits</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) tits round asses</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) lesbians</a>
[URL=URLリンク(www.pic.ucla.edu)
<a href="URLリンク(www.pic.ucla.edu) pussy</a>
[URL=URLリンク(www.pic.ucla.edu)
719:デフォルトの名無しさん
07/09/22 12:51:29
>711
>delete[] は type* (この場合 char* )から
>sizeof(type) * (プログラマからは見えない、確保された要素数)
>の分だけのバイトを開放するという挙動でしょうか?
確実に言えるのは new[] で確保された領域が解放される、ということだけ。
サイズについては例えば 16 バイト単位とかに切り上げられてるかもしれない。
なお、delete[] については、静的な型と動的な型が一致することが要請されている。
> 14882:2003 5.3.5/3
>In the second alternative (delete array) if the dynamic type of the
>object to be deleted differs from its static type, the behavior is undefined.
で、気にしているだろうキャストについては、一度 void* にキャストした後、
元の型に戻した場合、値が一致することは保証されているので問題ない。
> 14882:2003 5.2.9/10
>A value of type pointer to object converted to “pointer to cv void” and
>back to the original pointer type will have its original value.
720:デフォルトの名無しさん
07/09/22 12:53:50
静的な型と動的な型の一致とは?
721:デフォルトの名無しさん
07/09/22 13:01:43
>>720
静的な型とはソースコード上の型、
動的な型とは実際の型のこと。
例えば、クラスDがクラスBを継承していたとして、
こういうことはやめてということ。
B* p = new D[n];
delete[] p;
722:713
07/09/22 13:05:16
>>714>>715>>716
なるほど、参考になります。ありがとうございます。
私のところではconstは一切禁止のようです。
「constを使うとコードの量が増えて読みにくい」
「constを使わずに読みやすいコードを書けば、コーディングミスも少ないから効率がよい」
という理由だそうです。
723:デフォルトの名無しさん
07/09/22 13:09:35
このスレッドがふさわしいかどうかわかりませんが、
質問させてください。
C++でリングバッファを作成しようと思っています。
Read PointerとWriter Pointer、そしてBufferを用意し、
Bufferから"複数バイト"を取得する、という処理です。
for(int i = 0; i < num; i++)
if(ReadPointer != WritePointer){
value = Buffer[ReadPointer];
ReadPointer = (ReadPointer + 1)%BufferSize;
}
else
break;
}
上記のように1バイトずつ読み込むならこれでいいとおもうのですが、
これでは1バイトごとに条件文+インクリメントが入るため避けたいです。
一気に複数バイトを読み込むことを考慮した場合、
"ReadPointerがWritePointer"を
越えないことを判断して、バッファを参照することが必要です。
複数バイトを読み込む場合を考慮したリングバッファを実現する
スマートなアルゴリズムはあるのでしょうか?
ReadPointer < WritePointerの位置関係からバッファ読み込みを
一気に行うことは容易ですが、ReadPointer > WritePointerの
位置関係からバッファ読み込みを一気に行う処理で詰まっています。
724:デフォルトの名無しさん
07/09/22 13:11:12
なんだか前世紀からタイムスリップしてきたみたいな職場だな。
組み込みでCを使ってるって言うのならまだ分かるが、
それでC++かよ。
725:デフォルトの名無しさん
07/09/22 13:15:23
#define N 7をconst N = 7;にしたところで
コードの量が増えるとは思わないけど。
constにも色々とあるけどさ。
726:デフォルトの名無しさん
07/09/22 13:32:05
>>707
auto_ptr 使えば。
727:723
07/09/22 13:33:38
>724
ご返信ありがとうございます。
特に組み込みなどではありません。
通常リングバッファはどのようにして実装するのが通例となっているので
しょうか?セオリーなどが確立しているのでしょうか?
728:デフォルトの名無しさん
07/09/22 13:42:40
>>726
new[]したものをdelete[]しないのは駄目だろ。
scoped_arrayとかshared_arrayとか結局Boost頼み。
729:デフォルトの名無しさん
07/09/22 13:46:48
>>727
BufferSize-ReadPointer 分だけ memcpy してから、
ReadPointer をゼロにして続きを処理すればよい。
C++ では普通テンプレートベースの汎用クラスを用いる。
高速化の必要がある場合には自前で書く。
(ココに高速化の必要がある場合には、リングバッファから取り出して
別の場所へコピーなどしないでバッファを直接読んで処理する方が
良いことが多いけど)
730:デフォルトの名無しさん
07/09/22 13:52:42
普通に一バイトずつ読み込めばいいだろが
一度に20バイトずつコピー出来ても大して変わらないだろ
731:723
07/09/22 13:57:09
>727
ご返信ありがとうございます。確かに2回に分けてBufferを取得すれば
可能です。
テンプレートベースの汎用クラスを用いる、というのはdequeなどを
使用するということでしょうか?
高速化を目指しております。
>(ココに高速化の必要がある場合には、リングバッファから取り出して
>別の場所へコピーなどしないでバッファを直接読んで処理する方が
>良いことが多いけど)
汎用クラスを用いず、地道にmemcpyなどを使ってデータを取得したほうが
よいのでしょうか?繰り返しの質問になってしまいますが。
732:デフォルトの名無しさん
07/09/22 14:00:44
>>721
>B* p = new D[n];
>delete[] p;
これダメなの? これに対応する為にvirtualデストラクタがあるんだと思ってたけど。
733:デフォルトの名無しさん
07/09/22 14:04:13
>>731
そうではなくて、ココをチューニングする必要があるのは
おそらく数M〜数十Mバイト毎秒の処理を行う場合なわけで、
そんなものをメモリ上でこっちからあっちへコピーする処理自体
無駄なのでやらないようにする、ということです。
例えば映像のデコーダの入力段でリングバッファを用いるような場合、
read(buf, n) などとしていちいちバイト列をコピーして取り出すのではなく、
char* peek(size_t n) のように直接内部のバッファを覗くための関数を用意して、
リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
734:デフォルトの名無しさん
07/09/22 14:09:24
N 最後のナンバー
n番 からdバイトコピーするとする
if ( n + d - 1 > N){ memcpy(*,*, N - n - d); memcpy(*,*, n + d - N);}
else memcpy(*,*, d);
のようにすれば良い
735:723
07/09/22 14:11:23
>731
ご返信ありがとうございます。理解が乏しいかもしれないので
確認させてください。
readはmemcpyにより格納されたほかのバッファを利用する、ということで
peekはmemcpyで移さずにそのまま参照するということですね。
そして、リングバッファ自体はC++の汎用クラスを使って問題ないという
ことでしょうか?
>リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
リングバッファ終端以外はpeak()、終端ではmemcpyなどを使って処理する、
ということでしょうか?
リングバッファの実装が初めてでなかなかイメージがわいてこない状況です。
何度も質問してしまって申し訳ありません。
736:713
07/09/22 14:13:21
低スキルなので>>723の質問の意味が分からなくて
>>724は私(>>722または>>713)に対するレスかと思ってしまいましたw
違ったのですねw
>>725
仮引数とかにconstをつけるとコードの量が増えて読みにくいから禁止なのだそうです。
737:724
07/09/22 14:13:58
>>727
いや、ひとつ上にレスしただけ。
738:723
07/09/22 14:18:17
>734
実際のサンプルを教えてくださってありがとうございます。
ぜひ参考にさせていただきます。
739:デフォルトの名無しさん
07/09/22 14:19:42
>>738
コードは間違ってる所あるけど、
終端を乗りこえていたら、分割して先頭からコピーすればいいだけ
740:デフォルトの名無しさん
07/09/22 14:30:07
>>735
Q1.前半 Yes. 後半 No.
Q2.
用途によります。動画のデコーダなどの場合は一度にリニアに
アクセスするのは高々数十バイト程度なので、一時的なバッファに
コピーしてそこのポインタを返す、あるいは内部バッファを余分に
確保しておいて、バッファ先頭にある続きのデータをそこに複製して
リニアに読めるようにする、等。
読む側の処理が簡単なものなら、終端をまたぐケースだけ
前半、後半に分けて処理するようにしても良いでしょう。
Q1. の後半とも関連するのですが、ただひとつ言えることは
ここを自前で実装すべきなのは、レアケースであって、その場合には
プロファイラやテストなどを行って確かめつつ最適なコードを書く必要があり、
定石みたいなものは無いということです。
ただまぁmemcpyは各社最適化されていて早いコードで実装されてるので、
チューニングしたいんだけど時間がないとかいうときには便利。
741:デフォルトの名無しさん
07/09/22 14:32:00
言い切ってやる。高速化すべきポイントはそこじゃない。
742:デフォルトの名無しさん
07/09/22 14:33:50
>>736
>724はあんた宛だと思うよ。
で、正直そんな会社は私の仕事関係なら出入り禁止にします。
743:デフォルトの名無しさん
07/09/22 14:34:05
>>736
>コードの量が増えて読みにくい
本当にこれだけの理由なら↓これらに当てはまりそうだ。
スレリンク(prog板)
スレリンク(prog板)
スレリンク(prog板)
constがない→何らかの変換が行われる、と予想してそのつもりで読むからな。
constがあることは読み手への助けになるのだよ。
744:デフォルトの名無しさん
07/09/22 15:14:29
>732
仮想デストラクタがある場合に OK なのはこっち。
B* p = new D;
delete p;
745:デフォルトの名無しさん
07/09/22 15:19:04
>で、正直そんな会社は私の仕事関係なら出入り禁止にします
内容の是非はともかくこういう言い方ってDQNじみてると思うんだが
746:デフォルトの名無しさん
07/09/22 15:21:32
スルーしる
747:デフォルトの名無しさん
07/09/22 15:23:02
>>744
これは仮想デストラクタがなくても領域自体は確保されるんですよね?
Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど
748:713
07/09/22 15:28:43
>>737>>742
やはり私に対するレスなのですか。
では改めて・・・
>>724
組み込みではないけど、昔はCを使っていたそうなのでその名残でしょうか?
const以外にもいろいろ禁止されました。
私はfor文を
for(int i = 0; i < size; i++)
{
}
と書いていたのですが、これもダメで
int i;
for(i = 0; i < size; i++)
{
}
とか書かなければならないそうです。
理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。
>>743
確かに辞めたくなりますが・・・
いろいろダメだと言われても私は低スキル(頭が悪い)なので理由が良く理解できなくて
それでここで質問してみようかと・・・。
スレ違いでしょうか?
749:デフォルトの名無しさん
07/09/22 15:31:23
>>748
おめーと同僚や上司は頭悪いよ
空白は無視されるのが規則なんだよ 速度に違いは出ない
750:デフォルトの名無しさん
07/09/22 15:34:57
>>748
>理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。
寧ろ、あなたの書き方の方が速くなったりメモリが減るかも知れません。まぁ、大抵は同じでしょう。
いずれにしろ、一概には言えません。そんな根拠もないようなことを言っているようではお郷が知れると言うものです。
>確かに辞めたくなりますが・・・
私と一緒に働きませんか?w
>スレ違いでしょうか?
まぁ、宜しいのではないかと。
751:デフォルトの名無しさん
07/09/22 15:35:53
空白じゃなかった intの定義する位置か
752:デフォルトの名無しさん
07/09/22 15:37:51
>>749
>空白は無視されるのが規則なんだよ 速度に違いは出ない
i の宣言場所の違いが判らん香具師は黙ってらっしゃい。
753:デフォルトの名無しさん
07/09/22 15:41:37
関係ないけど
VCだと
for(int i = 0; i < size; i++)
って書いても
int i;
for(i = 0; i < size; i++)
こう書いてるように動くね
754:デフォルトの名無しさん
07/09/22 15:42:21
>>763
それはVC6とかの話じゃないのか
755:デフォルトの名無しさん
07/09/22 15:48:42
>>744 レスサンキュー
まじかー、紛らわしいというか不便だな。
B* p = new D[n];
delete[] dynamic_cast<D*>(p);
めんどくちゃいけど、これなら大丈夫だろうか。
まあ、ことさら >>732みたいに敢えて基底クラスのポインタで確保/解放する意味もないんだろうけどなぁ...
>>748
ちなみにそのfor文は上と下で i のスコープが変わると思うが、
for文に入る度にiが確保しなおされるとしたら速度変わるカモな。
使用メモリが増えるかどうかは分からん。
756:デフォルトの名無しさん
07/09/22 15:51:13
for文のiとかjってやっぱり仕事なんかで使うときもiやjなの?
757:デフォルトの名無しさん
07/09/22 15:54:34
>>755
>>753はVC(6以前)でスコープが同じになる事を言ってるんだよ
メモリ・速度云々は関係なく
758:デフォルトの名無しさん
07/09/22 15:57:58
>>756
i, jで何か文句あんのか?
759:デフォルトの名無しさん
07/09/22 15:59:46
>>756
単なるループ変数にたいそうな名前が付けられると
かえって読みにくくなるよね。
760:デフォルトの名無しさん
07/09/22 16:04:07
>>758
実際こんがらがって間違える事例を数件目撃したことがある。
慣れてくりゃなんともないが初学者にiやjで教えるのはどうかと思うんだよなぁ
761:デフォルトの名無しさん
07/09/22 16:07:07
>iとj
俺は目視デバッグでチェック項目の一つになってるわ
762:デフォルトの名無しさん
07/09/22 16:10:24
iやjにも元は意味があったろう
今じゃお決まりの変数として定着しているが
763:デフォルトの名無しさん
07/09/22 16:10:26
>>755
それだけなら動くだろうけど、
p経由で扱えるのは先頭要素だけ。
メモリ上にDのインスタンスが連続して並んでいるので、
p[1]が指す位置は、先頭の次の要素ではなく、
おそらくDの配列の先頭要素内の中途半端な位置。
764:723
07/09/22 16:14:51
>740, 741
ご返信ありがとうございます。
やりたいこととしては、参照用のリングバッファを書き込み用のリングバッファに
定期的に10KB〜300KB程度のデータを移したいと思っております。
(まず初めに最終的にやりたいことを書かなくてすいません)。
この場合は、終端をまたぐケースを考慮して(734さんのコードを参考、
2回の処理に分けるなどをする)、memcpyを使う、という方向で
考えたいと思います。
ただ一点、やはりC++の汎用クラスを使うのがいいのか、単純に
配列を使ってリングバッファを実装すればいいのか悩んでいるところです。
>ここを自前で実装すべきなのは、レアケースであって、その場合には
ここっていうのはreadとかpeak()のことですよね?
>言い切ってやる。高速化すべきポイントはそこじゃない。
この部分ばかりに注目するのではなく、
他の処理アルゴリズムをもっと最適化しろってことでしょうか?
確認ばかりのレスになってすいません。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5387日前に更新/205 KB
担当:undef