C++相談室 part88

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part87
http://hibari.2ch.net/test/read.cgi/tech/1291890680/

http://hibari.2ch.net/test/read.cgi/tech/1289292155/l50
このスレもよろしくね。

ついでに壁紙にしてね。
http://www.research.att.com/~bs/Bjarne.jpg
2v(^・^)v:2011/02/08(火) 14:18:09
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[Stroustrup大聖人]
 http://www2.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3v(^・^)v:2011/02/08(火) 14:19:25
■Libraries■
[Boost]
 Boost http://www.boost.org/
 (日本語) http://www.kmonos.net/alang/boost/
 (日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL http://www.sgi.com/tech/stl/
 STLport http://stlport.sourceforge.net/
 GNU libstdc++ http://gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
 STLFilt http://www.bdsoft.com/tools/stlfilt.html
 (日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 http://sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4v(^・^)v:2011/02/08(火) 14:20:22
5v(^・^)v:2011/02/08(火) 14:21:07
6v(^・^)v:2011/02/08(火) 14:21:49
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

-------------------------------------------------

テンプラ終わり(・∀・)
7デフォルトの名無しさん:2011/02/08(火) 14:45:54
ある二つのクラスでのみ使いたい定数がある場合にその定数はどう管理するのがいいの
定数だけ定義されたクラスを作ってクラス名::定数名でアクセスするのがいいの
8デフォルトの名無しさん:2011/02/08(火) 14:50:13
>>7
一つ目のクラスでprivateでstatic const で定義し、二つ目のクラス用にそれをfriendにする
9デフォルトの名無しさん:2011/02/08(火) 14:57:16
定数ならヘッダにでも書いとけばいいじゃん
10デフォルトの名無しさん:2011/02/08(火) 15:15:17
これでもいいのでは

class Test2;

class Test1 {
static double d;
public:
friend class Test2;
static void printd() {
std::cout << d << std::endl;
}
};

double Test1::d = 1.23;

class Test2 {
public:
void printd() const {
Test1::printd();
}
};

int main()
{
Test1 t1;
Test2 t2;

t1.printd();
t2.printd();
}
11デフォルトの名無しさん:2011/02/08(火) 15:15:21
C++で音楽を再生したいのですが良い方法はないでしょうか?
ARを用いてWEBカメラで対象のマーカーを認識したのちに出力といった形にしたいです。
形式としては、メモリに最初読み込んで、マーカー認識時に音楽再生

現状は
#include <mmsystem.h>と、リンカで Winmm.lib を追加しています。
プログラム的には、

int main(void)内に、
PlaySound("testfile.wav",NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
で再生し、PlaySound(NULL, ,NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
で停止させています。

DirectXのLoadSoundMemを使えば、一行で済むのですが
if( DxLib_Init() == -1 ) return -1; // 初期化
DirectX初期化時に黒枠ウィンドウ(CMD)が残るため、使い物になりません。

良い方法ないでしょうか?
12デフォルトの名無しさん:2011/02/08(火) 15:51:19
SND_MEMORYじゃダメなの?
なんでそんなめんどくさいことしてるのかわからん
13デフォルトの名無しさん:2011/02/08(火) 16:16:27
>>11
該当スレ行け
14デフォルトの名無しさん:2011/02/08(火) 16:38:26
>>12
SND_MEMORYちょっと調べてみます、サウンド系はDirectXでしか触ったことないので
ググッても中々…

>>13
一応ARはC++で作成するものですので(他にもありますが)
該当スレかと
15デフォルトの名無しさん:2011/02/08(火) 16:42:19
>>12
SND_MEMORY調べたときにsndPlaySoundも見つけ上手く出来ました感謝。
sndPlaySoundA((LPCSTR)lpSound,SND_ASYNC|SND_MEMORY);
16デフォルトの名無しさん:2011/02/08(火) 17:17:05
すみません std::uninitialized_copyを見て思ったのですが
コピーの途中でコピーコンストラクタが例外を投げて、コピーが中断したら
途中までコンストラクトされた要素はデストラクトされるのでしょうか?

もしデストラクトされない場合は、try-catchで捕捉してデストラクトする
などの処理が必要でしょうか。
17デフォルトの名無しさん:2011/02/08(火) 17:18:46
デストラクタは呼ばれるから気にしなくていい
1816:2011/02/08(火) 17:36:11
>>17
ご教示ありがとうございます。
なるほどデストラクタは呼ばれるのですね。勉強になりました。
19デフォルトの名無しさん:2011/02/08(火) 18:02:34
>>14
それはDirectXじゃなくてDXライブラリだって話もあるが、
そもそもAPIの話は該当スレに行けと言ってんだよ
20デフォルトの名無しさん:2011/02/09(水) 01:55:11
誰がDirectXとDXライブラリを混同してんの?
つっこむなら、DirectXでやったことあるならわざわざDXライブラリ経由しなくていいじゃんって方向じゃないか?
21デフォルトの名無しさん:2011/02/09(水) 02:13:12
shared_ptrと同じ機能で、アクセスするときに*演算子がいらないようなスマートポインタはありませんか?
22デフォルトの名無しさん:2011/02/09(水) 02:23:56
>>21
一般的なポインタのルールにのっとってそういう感じになってるわけだからねー。
23デフォルトの名無しさん:2011/02/09(水) 03:04:52
operator.()ができないからC++では不可能
つか、
shared_ptr<T>ptr;
ptr.use_count()でshared_ptr<T>::use_count()を
ptr->use_count()でT::use_count()を呼び分けてるのは分かってる?
24デフォルトの名無しさん:2011/02/09(水) 16:59:41
template<class T>
class Test
{
public:
 void test2(T* pTest) {}

 void test1() {
  Test<Test<T>*>* pTestTest = new Test<Test<T>*>();
  pTestTest->test2(new Test<T>());
 }
};
Test<int> test();
test.test1();

このコードをコンパイルすると
pTestTest->test2(new Test<T>());
の箇所で
「1 番目の引数を 'Test<T> *' から 'Test<T> *' に変換できません。」
とコンパイラに怒られてしまいます。
型解決が無限ループとなっている(?)のが原因だと思うのですが、Testクラス外でtest1を定義する以外に解決方法はありますでしょうか?
よろしくお願いします。
25デフォルトの名無しさん:2011/02/09(水) 17:23:54
Test<Test<T>*> の場合 test2 の引数は Test<T>** だから new Test<T>*() ならいけるんじゃない
26デフォルトの名無しさん:2011/02/09(水) 20:25:38
こんな感じか
gcc4.5.1(MinGW + Eclipse CDT)で実行済

template<class T>
class Test
{
public:
void test2(T* pTest) {
if (!pTest)
return;
std::cout << "test2()" << std::endl;
}

void test1() {
Test<Test<T>*>* pTestTest = new Test<Test<T>*>();
pTestTest->test2(new Test<T>*());
}
};

int main()
{
Test<int> test;
test.test1();
int i = 0;
test.test2(&i);
}
27デフォルトの名無しさん:2011/02/09(水) 21:23:12
>>25-26
単純に型の指定ミスだったとは…
おかげさまで解決しました。ありがとうございました
28デフォルトの名無しさん:2011/02/09(水) 23:43:47
ttp://codepad.org/j0UWW8C3
上のようなコードを思いついたので、実装してみたんだが、仕様的にはだいじょうになのかな??
環境はVC10EEでつくったんだけど、そのページのGCCでも期待通りに動いてるみたいだ。
2928:2011/02/09(水) 23:49:07
よく見たら説明になってない。
テンプレートの型指定子に毎回異なるものを入れると並列化されるみたいなんだけど、
これは環境依存になるのかな?

って書けばよかった。Orz
30デフォルトの名無しさん:2011/02/10(木) 08:41:15
>>29
ちゃんと見てないけど型にしろ定数にしろ
template に渡すものが違えば別の型になるよ。
3128:2011/02/10(木) 12:53:40
>>30
レスさんきゅー。一応、大丈夫そうだね。
何か機会があったら活用してみたいとおもいますー。
32デフォルトの名無しさん:2011/02/12(土) 10:48:21
LinuxでC++やってます。
別スレッドから、親スレッドのGUI部品にアクセスするには、どういった手法があるのでしょうか?
33デフォルトの名無しさん:2011/02/12(土) 11:13:49
同期します。
34デフォルトの名無しさん:2011/02/12(土) 11:22:18
>>11もそうだけど、C++使って○○の開発をやってるからって、○○の質問をここでするなって。
○○相談室じゃないんだから。
3532:2011/02/12(土) 11:40:57
>>33
すみません。別スレッドは常に特定の通信用ポートにバインドされていて常時Listen状態で、基本的に終了しません。
必要なログ情報を、メインスレッドのリストボックスに吐き出していく仕様です。
36デフォルトの名無しさん:2011/02/12(土) 12:08:12
キュー
3732:2011/02/12(土) 12:28:39
>>36
キューも考えました。
子スレッドからキューに書き込んで、メインスレッドからキューを読み込む。
でもメインスレッドを、キューを読むループ状態にしてしまって、GUIイベント処理って可能でしょうか?
C#だとデリゲートがあるけど、デリゲートがない言語だとどうやって実装してるのでしょうか。
38デフォルトの名無しさん:2011/02/12(土) 12:45:43
キューでもイベントでもなんでもいいよ。
とにかくUIスレッドのメッセージループと同期しなきゃ始まらんだろ。
同期方法はGUIライブラリが提供してるからドキュメント読め。
C++でスレッドは規格外だからC#みたいな標準的な方法なんてのはないよ。
だからスレ違い。
39デフォルトの名無しさん:2011/02/12(土) 23:51:05
>>37
デリゲートってスレッドで実装されてんじゃないの?
40デフォルトの名無しさん:2011/02/13(日) 04:06:35
わたしたちのデリゲートゾーンの悩みに。
41デフォルトの名無しさん:2011/02/13(日) 04:08:09
デリゲートは関数の動的型付けだよ
42デフォルトの名無しさん:2011/02/13(日) 16:48:37
は?
43デフォルトの名無しさん:2011/02/13(日) 18:15:33
>>41
どゆこと?
44デフォルトの名無しさん:2011/02/16(水) 06:36:55
メンバ関数ポインタを、テンプレートクラス内のクラス(イテレータのようなもの)のメンバ関数に渡そうとして躓きました
以下のような感じで「型"void (test2::*)(aaa&, test<aaa>::iterator)"の引数は型"void (*)(aaa&, test<aaa>::iterator)"のパラメーターと互換性がありません」というエラーが出ます
どうすればメンバ関数を関数に引数として渡せますか?
Visual C++ 2010使ってます

//test.h
template < class T > class test {
public:
  class iterator {
  public:void yobidashi( void (*function)( T&, iterator ) ){}
  }
}

//hoge.h
#include <test.h>
struct aaa {
  ・・・
}
typedef test<aaa> testaaa;

//test2.h(実際はヘッダとソース分けてます)
#include <hoge.h>
class test2 {
private:
  void func( aaa& a, iterator ite ) {}
public:
  void zikkou(){
    testaaa::iterator ite;
    ite.yobidashi(func);
  }
}
45デフォルトの名無しさん:2011/02/16(水) 07:08:24
方法1.
std::bind と std::function を使う

//test.h
template < class T > class test {
public:
  class iterator {
  public:void yobidashi( std::function<void ( T&, iterator )> function ){}
  }
}

//hoge.h
#include <test.h>
struct aaa {
  ・・・
}
typedef test<aaa> testaaa;

//test2.h(実際はヘッダとソース分けてます)
#include <hoge.h>
class test2 {
private:
  void func( aaa& a, iterator ite ) {}
public:
  void zikkou(){
    testaaa::iterator ite;
    using namespace std::placeholders;
    ite.yobidashi(std::bind(func, _1, _2));
  }
}

方法2. void func( aaa& a, iterator ite ) {} -> static void func( aaa& a, iterator ite ) {} に変更
46デフォルトの名無しさん:2011/02/16(水) 07:10:07
ite.yobidashi(std::bind(&func, this, _1, _2)); だった
47デフォルトの名無しさん:2011/02/16(水) 09:48:18
>>45-46
標準だと &func じゃメンバ関数へのポインタにはならないよ。 VC++ だと通るみたいだけどね。
&test2::func って書かないと。
48デフォルトの名無しさん:2011/02/16(水) 09:54:13
てかそもそも>>44は関数ポインタとメンバ関数ポインタの違い分かってるのかなぁ。
49デフォルトの名無しさん:2011/02/16(水) 13:02:41
メンバ関数ポインタはthisも渡さないと意味ないよね
5044:2011/02/16(水) 14:19:11
>>45
方法1だと
void yobidashi( void (*function)( T&, iterator ) ){}
void yobidashi( int (*function)( T&, iterator ) ){}
void yobidashi( void (*function)( T& ) ){}
void yobidashi( int (*function)( T& ) ){}
みたいにいろいろ用意したいときできないようですし
方法2だとtest2::funcにおいてthis->・・・のようなアクセスができないようです


すいません普通の関数ポインタと同じ程度に考えていたのでここまでいろいろな制約ができると思わず詳しく書きませんでしたが
様々な関数型で呼び出しできてthis->・・・でアクセスすることもできる方法はないでしょうか
51デフォルトの名無しさん:2011/02/16(水) 15:05:43
なんでイテレータにyobidashiなんてものが必要なのかよくわからない
zikkouでイテレータからTを得てfuncを呼び出すんじゃいかんのか
52デフォルトの名無しさん:2011/02/16(水) 17:51:38
yobidasiをテンプレートにするとか。
53デフォルトの名無しさん:2011/02/16(水) 19:18:46
>>51
将棋盤のような8方向に移動できる連結リスト構造を作っていて
イテレータで直線的な移動はできるのですが周りの8マスに同じ処理するときは関数呼び出しで効率よくできないかと思いまして・・・

>>52
もう少し詳しく教えてもらえないでしょうか
54デフォルトの名無しさん:2011/02/16(水) 20:20:27
void yobidashi( std::function<void ( T&, iterator )> f ){}
void yobidashi( std::function<int ( T&, iterator )> f ){}
void yobidashi( std::function<void ( T& )> f ){}
void yobidashi( std::function<int ( T& )> f ){}
でいいじゃん
55デフォルトの名無しさん:2011/02/16(水) 20:21:30
template <class T> yobidashi(T t) でもいいじゃん
56デフォルトの名無しさん:2011/02/16(水) 23:11:14
>>54
それだとbindで関数渡そうとしたとき複数のインスタンスが引数リストと一致しますてなってうまく判断してくれません

>>55
理解力がなくてすいません
それは何をしようとしているのかもう少し詳しく教えてもらえませんか
57デフォルトの名無しさん:2011/02/16(水) 23:35:17
>>53
こんな演算子作って、複素数で好きな方向に進めるように指定したらどう?
iterator& operator+=(const complex<int>& direction)
58デフォルトの名無しさん:2011/02/17(木) 01:27:49
>>53
イテレータからTを得てfuncを呼び出すんじゃいかんのか
59デフォルトの名無しさん:2011/02/17(木) 02:02:42
static task()
{
時間のかかる処理
}

static func()
{
  task();
}

main()
{
CreateThread(NULL, func…);
CreateThread(NULL, func…);
}

この時、task内のローカル変数って、一つ目と二つめのスレッドで独立しているのでしょうか?
ふと迷ったのでよろしくお願いします。
60デフォルトの名無しさん:2011/02/17(木) 02:18:30
>>59
スレッド関連はいまのところ実装依存。
自動変数にスタックを使う典型的な実装では、 static と指定しない限りは独立したものになる。
61デフォルトの名無しさん:2011/02/17(木) 20:44:30
59は関数に対するstaticを何か特別なものだと思ったんじゃなかろうか
62デフォルトの名無しさん:2011/02/17(木) 22:04:16
独立してなかったらほとんど使い物にならないと思うが...
63デフォルトの名無しさん:2011/02/17(木) 22:20:34
atomic みたいなキーワードが追加されて、スレッド間で共有されるアトミックな変数が宣言できるようになったら便利じゃねーかと一瞬思った
atomic int count;
みたいな
64デフォルトの名無しさん:2011/02/17(木) 22:31:34
アトミックな変数って何?
その変数を使った処理はすべてアトミックに処理されるってこと?ならずいぶんワイルドである。
65デフォルトの名無しさん:2011/02/17(木) 22:33:04
compare-and-swap演算子がないといまいち
66デフォルトの名無しさん:2011/02/17(木) 22:42:01
count %= 2;
軽く死ねるな
67デフォルトの名無しさん:2011/02/19(土) 05:03:05
以下のような、「あるオブジェクトへのポインタを保持する機能」を
テンプレートクラス化したものを作ってみたんですが、VC2008Expressでは通るものの
Codepadやideoneに貼るとエラーになりました。

http://codepad.org/aB4RFpdY

色々いじってみたんですが、なぜエラーになるのかよくわかりません・・・
68デフォルトの名無しさん:2011/02/19(土) 09:17:12
>>67
const Derived *p = static_cast<const Derived *>(this);
const has_dependency_pointer<typename T::__base_t> *dp = p;
return *static_cast<T *>(dp->m_pDependingObject);
6967:2011/02/19(土) 09:51:10
ありがとうございます!
ベースクラスのメンバを::でアクセスするのがダメだったんですね。
テンプレートの解析周りとも絡んでるのかな・・・調べてみます。
7067:2011/02/19(土) 11:21:21
どうやら構文解析が追いつかなくなっただけだったようです、
>>68のようにポインタを介すか、もしくはmain関数内で
lexical_castにGetDependingObject()の戻り値を直接渡さず
変数を介して渡せば大丈夫でした
71デフォルトの名無しさん:2011/02/19(土) 12:55:44
>70
Derived:: 外せば通った。
http://codepad.org/vizevSF9
コンパイラさん的には Derived の中身を知らない段階で Derived::has_dependency_pointer が何かを知る必要があるんだけど、
何も付けないとメンバだとして認識され、typename 付けると型として、template 付けるとメンバテンプレートとして認識される。
今回そのどれとも違う(has_dependency_pointer<...> で型として認識させたい)けど出来なさそう。Derived 外して通るしね。
7267:2011/02/19(土) 13:59:13
あああすみません、70で大嘘書いてました、仰るとおりDerived::のせいだったみたいです・・
いつのまにかDerived::外してましたorz
コンパイラの解析順序は勉強不足でわからないんですが、
DerivedのポインタなのにDerived::で型指定は明らかにおかしいですね。外したらlexical_castに直接渡そうが大丈夫でした。
ありがとうございました。
7371:2011/02/19(土) 14:17:07
訂正というか追加情報というか。ちょっと自信ないけど。
DR176 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#176 が出ていて
14882:2003 だと 14.6.1 で Derived::has_dependency_pointer<...> の使い方も可能と明記されているっぽい。
GCC でこの DR への対応は 4.5 http://gcc.gnu.org/gcc-4.5/changes.html でされていると書いているが
gcc 4.5 以降でも完全には対応できていないみたい。
7467:2011/02/20(日) 05:30:54.89
なるほど・・・、C++03で?一応合法ではあるんですね<VC2008で通る
ありがとうございました。
75デフォルトの名無しさん:2011/02/20(日) 10:27:07.29
あんまり込み入ったやり方より平易で確実な書き方をする方がよい。
76デフォルトの名無しさん:2011/02/20(日) 22:20:57.52
名前空間について教えてください。
- a.h -
namespace NS {
class A {};
extern A a;
// aを使って何かする
}
- a.cpp -
#include "a.h"
using namespace NS;
A a;
int main() {
a;
return 0;
}
↑のコードではaが曖昧だとしてコンパイルエラーが出ます。
これについてのC++の仕様などが説明してあるようなところがありますでしょうか?
77デフォルトの名無しさん:2011/02/20(日) 22:24:48.98
>>76
NS::a と ::a の2つ宣言して、 using namespace NS したらどっちかわかんなくなるのは当然だと
思うんだけど、それ以外に何か説明が要るの?
78デフォルトの名無しさん:2011/02/20(日) 22:39:01.58
>>77
つまり
NS::A NS::a
と、
NS::A ::a
の違いってことでしょうか。
usingディレクティブではインスタンス側には適用されないということですか?
usingディレクティブが良く分かっていません。
79デフォルトの名無しさん:2011/02/20(日) 22:44:26.85
>>78
http://ja.lmgtfy.com/?q=C%2B%2B+using+%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96

個々の名前の解決に使われるだけ。型名と変数名の名前解決はそれぞれ別。
80デフォルトの名無しさん:2011/02/20(日) 22:55:10.07
>>79
ありがとうございます。
おかげでようやく意味がわかりました。
usingディレクティブの意味を誤解していたようです。
81デフォルトの名無しさん:2011/02/21(月) 00:46:08.17
上のコードを見て実験してみたんだけど

namespace A { int x = 1; }
using namespace A;
extern int x; // 問題の行
int x = 2;
int main() { std::cout << x << "\n"; }

"問題の行"がある時はあいまいエラー、
ないときは::xがA::xを隠蔽して正常動作。
"問題の行"の x はどっちの x を指してるんじゃろ?_?
82デフォルトの名無しさん:2011/02/21(月) 01:05:06.98
>>81
コンパイラ何使ってる?

余計に重複した宣言の有無は名前検索には影響しないから、
↓のとおりエラーになるのが正解。
http://codepad.org/3Joye0c4
83デフォルトの名無しさん:2011/02/21(月) 01:52:31.00
初期化を行わない vector が欲しい

C++ はゼロオーバーヘッドの原則が〜って言われるけど、
malloc で組んでた動的配列を std::vector に置き換えることはこの原則に反しないの?
std::vector<int> が領域確保後にゼロクリアするオーバーヘッドは無視できないと思うんだけど
何か勘違いしてるかな…
84デフォルトの名無しさん:2011/02/21(月) 02:52:04.81
class T
{
public:
T():x(0),y(1){}
union
{
int x;
int y;
};
};

こういうのは問題ありますか?
unionの初期化はどうするのが一般的でしょうか?
85デフォルトの名無しさん:2011/02/21(月) 07:21:46.46
>>83
reserve() じゃダメ?
86デフォルトの名無しさん:2011/02/21(月) 07:38:40.91
>>84
コンパイラ何使ってる?

一見して何がしたいのかわからん。
↓予想通りコンパイルエラーになった。
http://codepad.org/J2cLF0Hp
87デフォルトの名無しさん:2011/02/21(月) 07:53:34.52
>>86
BCCです。
codepadではエラーだったのですが、BCCでは通りました。
必ずエラーになると定義されていてBCCがおかしいのか、
定義されていない動作なのか分からなかったので。
それでなにかしたかったわけではなく、単純な疑問です。

BCCだと初期化後の値は1でした。
88デフォルトの名無しさん:2011/02/21(月) 07:58:00.07
>>87
順番に評価されるから 1 になるのを期待するのはわからんでもないけど、
それなら y(1) だけでいいじゃない、っていう。
89デフォルトの名無しさん:2011/02/21(月) 08:01:42.90
>>88
単純な疑問です。

宣言と実体を別に書いた場合、この x は初期化してたっけ?っていうのもあると思いますし。
90デフォルトの名無しさん:2011/02/21(月) 08:03:22.09
>>87
なら規格見れ。
91デフォルトの名無しさん:2011/02/21(月) 08:48:25.31
>>85
それってメモリ確保するだけで、
resize したときにゼロクリアされるでしょ
92デフォルトの名無しさん:2011/02/21(月) 09:04:44.70
resizeとreserveは違うぞ
勘違いしてないか?
93デフォルトの名無しさん:2011/02/21(月) 09:07:34.14
>>83,91
まさか不定な値を使いたいわけじゃないんだよね?
どんなケースを想定してるのか具体的な例を出してもらわないと伝わらないかも。
94デフォルトの名無しさん:2011/02/21(月) 09:11:37.78
いや、分かってるって
例えば 1MB のファイルを読み込みたいとして、1MB の領域を確保して使いたいとするじゃん
こういう場合どうする?resize するしかないよね?これだとゼロクリアが入ってしまってそれが無駄。
ゼロクリアの処理を回避して確保する方法ってある?
これだけなら new unsigned char[1024 * 1024] でいいけどさ、malloc / realloc や std::vector と違って後で拡張できないじゃん。
95デフォルトの名無しさん:2011/02/21(月) 09:14:49.01
reserveしてmemcpy(&v[0], 1Mのファイル);ってするな
96デフォルトの名無しさん:2011/02/21(月) 09:21:49.58
>>95 それはダメだ。
97デフォルトの名無しさん:2011/02/21(月) 09:46:54.72
>>94
なるほどね。
うまい方法は無いかなぁ。

特殊化の穴をつけばいけるかもしれないけど、特定の実装に依存したものにしかならないだろうな。
98デフォルトの名無しさん:2011/02/21(月) 10:36:27.72
コンテナに不定値はないんじゃないの
ゼロクリアがいやならinsertで初期化すればいい

それもいやなら……どうすればいいんだろうな
99デフォルトの名無しさん:2011/02/21(月) 11:46:25.29
boost::scoped_arrayを使う。
予めサイズがわからないなら諦めてvectorでresizeする。どうせオーバーヘッドとしては
大したものでもない。
100デフォルトの名無しさん:2011/02/21(月) 12:28:02.11
>>99
> C++ はゼロオーバーヘッドの原則が〜って言われる
Cと同じ処理をするにあたり、上記原則を満たさない場合があるってことでいいのかな
101デフォルトの名無しさん:2011/02/21(月) 12:30:21.64
確実な初期化をオーバーヘッドと見るか機能と見るかって違いじゃないの?
未初期かなのが欲しければ malloc() すりゃいいんだし。
102デフォルトの名無しさん:2011/02/21(月) 12:40:05.80
取り違えがあるぞ。そもそも Container の主たる役割はメモリ確保でない。
メモリ確保を行うのは Allocator の役割だ。
103デフォルトの名無しさん:2011/02/21(月) 12:40:35.01
で?っていう
104デフォルトの名無しさん:2011/02/21(月) 12:53:18.02
不定な状態のまま存在するというのは
コンストラクタも呼ばていないのにアクセスは可能でコピーできる
それでいて不定値ならばデストラクタを呼んではいけない
そんなコンテナは設計が難しすぎる
105デフォルトの名無しさん:2011/02/21(月) 12:58:56.74
不定値ならばデストラクタを呼んではいけないというのは初めて知った。規格?
106デフォルトの名無しさん:2011/02/21(月) 13:01:38.10
いや規格で決まっているわけじゃないけれど
コンストラクタが呼ばれないのにデストラクタが呼ばれるのは何か変ではないかと
107デフォルトの名無しさん:2011/02/21(月) 13:02:19.92
だからさ。そんなに未初期化領域が欲しけりゃ std::allocator でも Boost.Pool でも好きなの使えよ。
108デフォルトの名無しさん:2011/02/21(月) 13:08:52.54
コンストラクタ内で初期化されるから、vectorはmallocの代替にはならない
コンテナにアロケータの仕事のみをさせるのはそもそもおかしい

などとかいていたら>>107が颯爽と
109デフォルトの名無しさん:2011/02/21(月) 15:00:11.79
malloc()の置き換えはnew[]でしょ。
オーバーヘッドを許さないならrealloc()で拡張なんてできない。

> C++ はゼロオーバーヘッドの原則が〜
これってC++の言語仕様を決める奴らの指針でしょ。
110デフォルトの名無しさん:2011/02/21(月) 15:08:13.86
reallocと同程度のオーバーヘッドで、ということかと。
拡張だけですむなら拡張を、無理なら別のアドレスに確保をという挙動
111デフォルトの名無しさん:2011/02/21(月) 16:27:43.98
初期化しない以外は標準コンテナなvector欲しくなるよね。
俺は自作してるよ。
112デフォルトの名無しさん:2011/02/21(月) 20:10:01.63
俺が欲しいのはboolが特殊化されていないvectorだな
113デフォルトの名無しさん:2011/02/21(月) 20:20:07.83
deque<bool>で。ぜひ。
114デフォルトの名無しさん:2011/02/21(月) 20:32:27.95
vector<bool>を使いたいのに仕方なくdeque<bool>とタイプするたびに
これを承認したやつの髪の毛をむしりたくなるよ
115デフォルトの名無しさん:2011/02/21(月) 20:41:06.98
無残に禿散らかすよりはいっそすべてむしり取ってあげた方が親切というもの
116デフォルトの名無しさん:2011/02/21(月) 20:47:20.28
どうせ適当な値で上書きするんだから初期化が無駄ってことならサイズ 0 にしといて assign じゃあかんの?
117デフォルトの名無しさん:2011/02/21(月) 23:37:52.48
コピーもしたくないってこと。
118デフォルトの名無しさん:2011/02/22(火) 08:11:03.83
>>117
よく分からん。
未初期化な部分への代入か未初期化な部分へのコピーコンストラクトかの違いになるだけじゃないの?
119デフォルトの名無しさん:2011/02/22(火) 08:53:53.16
>>94
mmap使おうよ。
120デフォルトの名無しさん:2011/02/22(火) 11:36:01.96
ファイル読み込みはただの例で、それに限らず、未初期化の配列に大量のデータを書き出す
C スタイルの関数と組み合わせて使いたいって話だろう。
121デフォルトの名無しさん:2011/02/22(火) 13:37:26.22
再帰関数で引数以外の変数を静的スコープで解決したいんのですけど、
クラスにしたくは無いし、引数を多くしたくないんですけどどういう解決策がありますか?
ラムダ式は再帰できないのでわかりません。
引数を構造体にしたらどんな関数も引数一つで十分ですか?
122デフォルトの名無しさん:2011/02/22(火) 13:40:36.37
>>121
静的変数使えば?
最後の質問は、関数の仕様によるとしか言えない。
123デフォルトの名無しさん:2011/02/22(火) 13:43:40.80
なるほど、静的変数は思いつきませんでした。
静的変数は関数を始めに実行するときに初期化されて
終了するまで存在し続けるのですよね。
124デフォルトの名無しさん:2011/02/22(火) 15:55:18.60
>>120
そうです。例えばsocketからのrecvとか。
125デフォルトの名無しさん:2011/02/22(火) 23:12:41.01
ファイルI/Oにしろソケットにしろ、メモリクリアのコスト以上に掛かるんじゃね?
126デフォルトの名無しさん:2011/02/22(火) 23:37:47.40
>>125
データ読込は無駄なコストじゃないから。
無駄なメモリクリアやメモリコピーを排除したいのです。
127デフォルトの名無しさん:2011/02/22(火) 23:51:53.52
どうせプログラム全体の速度からしたら、誤差で無かったことになる程度しか変わらないけどね。
毎度のことながら馬鹿の考え休むに似たり。
128デフォルトの名無しさん:2011/02/22(火) 23:55:00.62
126はアホ
129デフォルトの名無しさん:2011/02/23(水) 00:03:11.29
trivially copyableでないクラスが突っ込まれることもあるvectorにはそういう機能はつけられんなあ
130デフォルトの名無しさん:2011/02/23(水) 00:46:01.41
>>127
本当にそうなら楽なんですけどね。
ギリギリの高パフォーマンスを求められるようなケースでは
無駄なメモリアクセスは極力排除したくなりますよ。
パフォーマンス実測で比較した結果として。
131デフォルトの名無しさん:2011/02/23(水) 00:48:18.26
ギリパフォが必要ならそもそもベク使う理由なくない?
値わたしが基本のSTLコンにそこまでパフォ求めても。
まるでニュにマロ並みの速度を求めるようなものだよ
132デフォルトの名無しさん:2011/02/23(水) 00:55:05.65
130はアホ
133デフォルトの名無しさん:2011/02/23(水) 00:57:44.49
>>129
non PODクラスはさすがに初期化しないわけにはいきません。
初期値指定が無い場合デフォルトコンストラクタが呼ばれ
る様にすれば問題ないです。
134デフォルトの名無しさん:2011/02/23(水) 00:58:21.16
そんなケースでSTL使うなよC++使うなよC使えよアセンブラ使えよ
135デフォルトの名無しさん:2011/02/23(水) 01:04:38.92
>>134 いや、 C++ 使う道具を間違えてるだけで、 C やアセンブラに降りる意味は無い。
136デフォルトの名無しさん:2011/02/23(水) 01:05:35.76
>>131
STLコンテナにしたい理由は既存のSTLコンテナ対象のライブラリを
使用したいからというのが大きいです。
newや他のメモリプールをMyStlLikeVectorClassでラップすること
のコストは無駄なメモリアクセスを発生させることに比べれば微々
たるものですよ。特に処理するデータブロックが大きい場合。
137デフォルトの名無しさん:2011/02/23(水) 01:08:04.03
C やアセンブラ使うと今度は開発コストが大きくなりすぎるから却下
138デフォルトの名無しさん:2011/02/23(水) 01:10:42.43
あほは相手にするな
vectorでいいから、使う分をはじめに十分確保しとけ
139デフォルトの名無しさん:2011/02/23(水) 02:49:30.47
つまりはSTLはコーディングが楽になるが、実行速度は遅いということだよね。
十分速いのかもしれないが、ある面で見ると遅くなっていることは否めないと。
140デフォルトの名無しさん:2011/02/23(水) 02:59:03.28
コンパイルも遅くなるよ!
141デフォルトの名無しさん:2011/02/23(水) 03:08:53.93
>>139
「STL」ってコンテナやらアルゴリズムやらごちゃごちゃ入ってるものを指して
「遅い」と断じるのに無理があるのは明らかだろう。

横着せずに「未初期化な配列を使っていたところをstd::vectorで置き換えたら
遅くなることがある」と正確に覚えろ。
142デフォルトの名無しさん:2011/02/23(水) 03:22:20.38
vectorは遅いですよね!はC++初学者が通る道
143デフォルトの名無しさん:2011/02/23(水) 03:26:34.51
速度低下のかわりに得られるメリットがあると書いてるつもりだよ。
配列の代替手段としてvectorを使うと速度低下を招くことには異論ないでしょ?

ある局面においては無駄な処理が行われてしまうことは認めなければならないし、
その速度差が重要な場面では、STLは遅いと断ずることは間違いじゃない。

現に、彼はその無駄な処理の有無によって生まれる速度差が有意なものであると感じてるわけで。

その上で、vectorの利便性を損なうことなく、初期化を省く手法はないのかと尋ねているのでは?
144デフォルトの名無しさん:2011/02/23(水) 03:26:45.68
遅い遅いっていうけど体感で言ってるの?
145デフォルトの名無しさん:2011/02/23(水) 03:29:45.50
らしいよ
>>130
146デフォルトの名無しさん:2011/02/23(水) 03:39:55.50
体感w
147デフォルトの名無しさん:2011/02/23(水) 03:47:24.21
>>143
> 配列の代替手段としてvectorを使うと速度低下を招くことには異論ないでしょ?

> その速度差が重要な場面では、STLは遅いと断ずることは間違いじゃない。

これが明らかな論理の飛躍だと言っている。

vector についての事実があったとしても、それを以って algorithm や iterator を
含めたライブラリ全体の速度の判断材料にはなり得ない。

いい加減にSTLとかいう妙なくくりを使うのもやめてほしい。
148デフォルトの名無しさん:2011/02/23(水) 05:29:08.27
struct BufValue {
  BufValue() {}
  char c;
};
std::vector<BufValue>  buffer;

これはコンストラクタがあるからだめなんだっけ?
149デフォルトの名無しさん:2011/02/23(水) 07:22:24.60
>>130
>パフォーマンス実測で比較した結果として。
具体的に何をどう比較したんだ?
やりもしないで、いい加減なことを言うのはやめた方がいいぞ。
150デフォルトの名無しさん:2011/02/23(水) 07:44:31.59
こんな感じのことをしてるだけだろ
for( int i = 0; i < 100000; ++i ) {
 for( int j = 0; j < 1000000; ++j ) {
  std::vector<int> foo(1000000); }}
Ω<遅い、耐えられん!
そりゃ遅くなるよ、としか言えない
151デフォルトの名無しさん:2011/02/23(水) 09:31:13.32
>>136
「既存のSTLコンテナ対象のライブラリ」がvectorしか受け付けないのが間違ってる。
「STLコンテナ」ってのはSTLの作法(beginとendの間をiteratorで回せるとか)を満たすコンテナ(当然自作のを含む)であって、特定のクラスではないよ。
152デフォルトの名無しさん:2011/02/23(水) 10:33:16.81
よくわかんないな
メモリの初期化コストが気になるくらいって
そんな大容量メモリ?
アーキテクチャ的にメモリが遅い?
前者ならそこそこの速度がありそうだし、
後者ならもっと下のレベルで裏技があることが多いような。

まあ、そんなギリギリな環境で STL 使うなやって思うけど。
STL が悪いって話じゃなくて、事実として、その環境では速度的な問題が出てるんでそ?
153デフォルトの名無しさん:2011/02/23(水) 11:34:11.05
何の役にも立たない無駄なところにこだわって開発が進まない奴って本当にクズ。
154デフォルトの名無しさん:2011/02/23(水) 11:44:02.86
>>153
俺のことかああああああああああああああああああああ

図星うわああああああああああああ


155デフォルトの名無しさん:2011/02/23(水) 11:59:50.85
クズ
156デフォルトの名無しさん:2011/02/23(水) 13:12:27.36
メモリアクセスが無駄な初期化+本来のデータ埋めで2倍に
なるという明白な事実も理解できないゆとりばかり。
157デフォルトの名無しさん:2011/02/23(水) 13:15:38.55
無能がはびこってるおかげで俺の仕事は増えるばかり。
158デフォルトの名無しさん:2011/02/23(水) 13:20:45.20
ということにしたいのですね
159デフォルトの名無しさん:2011/02/23(水) 13:29:03.61
そもそもメモリの初期化コストがどうでも良いような
案件ならなんでC++使うの?C#でも使えばいいじゃない。
160デフォルトの名無しさん:2011/02/23(水) 13:43:46.13
初期化コストとかいってるやつは、
自分のアルゴリズムが複雑怪奇か、何もしてないだけ。
やらなくていいのに毎回メモリ確保してるとか。使い回せばいいのに。
161デフォルトの名無しさん:2011/02/23(水) 13:45:53.39
確実にvectorでの確保がホットスポットになって
vector使う限りは回避不可能の具体例あげてみろ。
162デフォルトの名無しさん:2011/02/23(水) 14:32:12.91
>>156
確かに、その後に続くだろう1万回のメモリアクセスを加味して、
10001回のメモリアクセスが10002回になるなんてとんでもない話だよな

>>161
ホットスポット?
163デフォルトの名無しさん:2011/02/23(水) 14:51:58.31
ホットスポット=ボトルネック
とおもってくれ
164デフォルトの名無しさん:2011/02/23(水) 14:53:53.01

ホットスポット
【プログラミング】
能無しによって書かれた複雑怪奇で冗長的なプログラムのうち、特に処理が集中していて、その上効率悪く動いているサイテーサイアクの部分。
http://glossary.tank.jp/t05F4.html

Parallel Amplifierは、解析対象アプリケーションを実行し、各関数ごとにどれだけの時間が掛かっているかを解析し、ビジュアルに表示することで、開発者がボトルネックを見分けられるようにしてくれます。
http://codezine.jp/article/detail/5284?p=2
165デフォルトの名無しさん:2011/02/23(水) 14:59:09.13
ボトルネックが待ち時間で、
ホットスポットはCPUの処理時間。
CPU処理の集中がホットスポット。
166デフォルトの名無しさん:2011/02/23(水) 15:03:02.29
あ・そ・こ
167デフォルトの名無しさん:2011/02/23(水) 15:04:35.49
>使い回せばいいのに。
168デフォルトの名無しさん:2011/02/23(水) 15:27:04.92
>>162
同じデータを1万回もアクセスしなきゃいけないってどんな場合だよ?
そういう場合なら確かに初期化コストなんて誤差の範囲だね。
169デフォルトの名無しさん:2011/02/23(水) 15:32:43.19
だからなんで初期化コストがそんなにかかる案件で vector 使うのさw
170デフォルトの名無しさん:2011/02/23(水) 15:44:50.59
つーかたかだかvectorの初期化の速度にガタガタ文句を付ける顧客には
Core i7の2600番台を買わせろって

そんなにべらぼうに高いわけではないし、最悪待ってりゃ終わる事
171デフォルトの名無しさん:2011/02/23(水) 15:53:29.72
そういう問題じゃねえ。
vectorの初期化がボトルネックになるって、くそコードのせいだろ。
172デフォルトの名無しさん:2011/02/23(水) 15:55:52.78
へぼコードなんだ。
vector確保しかしていない OR vector確保回数が多く大半
173デフォルトの名無しさん:2011/02/23(水) 16:24:49.90
ギリギリの高パフォーマンスを求められるようなケースでrealloc()で拡張なんてしない。new[]でおk。
てか代替する必要がない。malloc()のままでおk。
そもそもクリティカルな所で動的確保するのがおかしい。
174デフォルトの名無しさん:2011/02/23(水) 16:33:31.95
ただ単にSTLセマンティックなコンテナ使用による開発効率UPを享受
した上でstd::vectorの無駄な初期化コストを省きたいということな
んだが、、、こんな不毛な議論になるとはw
初期化しないカスタムvector自作なんてnew[]を直接使うなんて保守
性の悪いやりかたがもたらす結果に比べれば遙かに楽なことなんだし。
175デフォルトの名無しさん:2011/02/23(水) 16:41:43.05
初期化しないカスタムvector自作なんて簡単だわー
二年前から自作してたわー
176デフォルトの名無しさん:2011/02/23(水) 16:52:11.35
メモリの初期化命令をあっさり無視する独自のallocatorクラスを記述して
それをvectorに渡せばいいじゃないか^^
177デフォルトの名無しさん:2011/02/23(水) 17:13:03.30
>>175
当然vectorの全機能搭載済みだよな?
178デフォルトの名無しさん:2011/02/23(水) 17:15:08.72
>>173
高パフォーマンスだったら、OSの機能、ハードウェアの機能を直に使えよ。winAPI、アセンブラなど。
179デフォルトの名無しさん:2011/02/23(水) 17:21:17.68
>>178
おいおい車輪の再発明はやめようぜ
プログラマも時間と金には限界があるんだぜ
180デフォルトの名無しさん:2011/02/23(水) 17:24:32.57
>>179
この部分だけやればOK

> メモリの初期化命令をあっさり無視する独自のallocatorクラスを記述して
> それをvectorに渡せばいいじゃないか^^
181デフォルトの名無しさん:2011/02/23(水) 20:26:59.64
そもそも初期値を設定することすらネックになる処理って何?
前提条件を明確にせずに方法論だけ語り出す奴らって、何の役にも立たないクズなんだが。
182デフォルトの名無しさん:2011/02/23(水) 21:04:07.70
俺はゼロフィルしてくれたほうが色々ありがたいけどね。
不定値の特定が難しいとデバッグが大変だ。
183デフォルトの名無しさん:2011/02/23(水) 21:20:51.36
基本的に >174 に賛成。

パーツとして使うものなんだからできるだけ無駄は排しておきたいというのはおかしなニーズだとは思わない。
全体に寄与するかどうかは別だけど、寄与しないから無駄だと思ってる奴は馬鹿が無駄に工数投入してるって
せせら笑っとけばいいだけなんじゃないの?
他人が無駄な工数を投入しているのが許せないとかそんな潔癖症でもないだろ、おまいら。

個人的には標準が要求する Allocator とか Sequence の要件を満たして実装できるのかが興味あるな。
184デフォルトの名無しさん:2011/02/23(水) 21:40:19.97
全体の速度測ってから考えろ。
動的に複数回の変更しなければ、どんなメモリ確保の仕方でも大差つかない。
vectorを多めにとって置きresizeつかえ。
拡張する自体になったとしても全体の影響は少ない。
初期化コストとかアホが考えること。

185デフォルトの名無しさん:2011/02/23(水) 21:44:17.60
メモリ初期化よりも、広大なメモリ空間確保すること自体が速度落とすぞ。
現代のPCはマルチタスクだ。一つのソフトが大きくメモリ占有したら
OS全体で仮想メモリの使用が増えて遅くなる。
低メモリを重視して、多くてもメモリ50Mくらいですむようにアルゴリズム考え直せ。
186デフォルトの名無しさん:2011/02/24(木) 00:03:01.00
つーかCPUの2次、3次キャッシュも効かないような広大なメモリ空間をアクセスする
ソフトを作ると大幅に速度が落ちるぞ

Photoshopなどはこれを回避するために特別な方法を使っている
187デフォルトの名無しさん:2011/02/24(木) 00:36:58.55
シーケンシャルなアクセスはキャッシュにヒットする確率が高いけど
やたらランダムにアクセスするアルゴリズムは対象サイズが大きくなると駄目だろうなあ
188デフォルトの名無しさん:2011/02/24(木) 06:41:54.81
C++の活躍の場はPCだけじゃないってこと時々でいいから思い出してあげてください

コンシューマ機のロード処理とかで極力余分なコストを省きたいことがあるけど
大抵はboost::scoped_array/boost::shared_arrayで問題ないなあ
サイズが変わるのはロードしなおすときくらいだからreset()で十分足りるし
189デフォルトの名無しさん:2011/02/24(木) 09:16:50.11
STLの例えばlist なんかを静的メンバにする場合、初期化する場合はどうやってやるのでしょうか
例えば int型だったら int Class::member = 0 とかやればいいですよね
でも listの場合だと list<Class1> Class::member = ? となってできません
list じゃなくても普通のClass も同じことですが
190デフォルトの名無しさん:2011/02/24(木) 09:25:54.99
>>189
コンストラクタがあるんで初期化子がなければデフォルト初期化でちゃんと空の list が
用意される。引数付きで初期化したければ ...::member(...); とすればいい。
191デフォルトの名無しさん:2011/02/24(木) 12:29:08.77
今日日コンシューマ機でもそんなにコスト高くねえよ。
毎フレいじるならともかく。
192デフォルトの名無しさん:2011/02/24(木) 12:34:48.70
俺毎フレでSTLのコンストラクタ走らせてた…。
pool使ったアロケータをtemplate型に与えてたから速度にそんなに影響しないと思ってたけど結構きつかったよ。
ごめんねコンピューター。
193デフォルトの名無しさん:2011/02/24(木) 14:44:36.37
最適化の弱いライブラリだとTがPOD型でもstd::uninitialized_fillが
for文で一要素ずつ0埋めしてたりするからね。要注意ですよ。
194デフォルトの名無しさん:2011/02/24(木) 14:47:31.96
標準のallocatorクラスは組み込みのnewと比べて大差ないからね^^
それでもアプリケーションレベルのプログラマんは十分な性能だと思うけど
195デフォルトの名無しさん:2011/02/24(木) 17:12:44.80
STLportのstd::allocatorは内部で固定サイズのメモリプール使ってる
196デフォルトの名無しさん:2011/02/24(木) 22:38:41.30
windowsでphpをC++に変換するか、
C++でphpの関数がつかえるヘッダファイルなどありますか。
197デフォルトの名無しさん:2011/02/25(金) 00:07:58.33
>>196
何がしたいのか気になる
198デフォルトの名無しさん:2011/02/25(金) 00:20:02.24
phpがもっとも使える、優れていると思うのでプログラムをphpに統一したいです。
199デフォルトの名無しさん:2011/02/25(金) 00:21:52.07
php使えばいいじゃん
C++関係ないじゃん
200デフォルトの名無しさん:2011/02/25(金) 00:26:21.90
phpは遅いのと、guiやグラフィックができないです。
ネイティブのEXEを作りたいです。
201デフォルトの名無しさん:2011/02/25(金) 00:36:24.49
phpは遅いのと、guiやグラフィックができなくて、ネイティブのEXEも作れないのに、
どこが使える、優れているんだら?
202デフォルトの名無しさん:2011/02/25(金) 00:36:51.93
>>200
C言語系列は知ってて損はないよ。お手軽にC#っててもあるぞー。
203デフォルトの名無しさん:2011/02/25(金) 00:38:01.54
C#はちょっと・・・
5年後には確実に役に立たない知識になるし
204デフォルトの名無しさん:2011/02/25(金) 00:39:16.19
C++の5年後か・・・
0xは完成しているんだろうか
205デフォルトの名無しさん:2011/02/25(金) 00:40:19.31
5年後にはC#も8.0ぐらいになってるのかな
206デフォルトの名無しさん:2011/02/25(金) 00:43:39.05
>>203
MS製の言語なんてそんなもんだよ
それか名前は同じでも中身は全く別物になってたりする
207デフォルトの名無しさん:2011/02/25(金) 00:47:02.96
MSしかサポートしていない言語だから
飽きたらサポートされなくなる可能性高いよね
J++も消えたし。J DirectとかWFCとか覚えた人はご愁傷様って感じ。
208デフォルトの名無しさん:2011/02/25(金) 00:50:55.38
>>201
言語の性能・使いやすさとコンパイラ・翻訳は別。
それにphpがDirectX、winAPIを扱えるように拡張することも開発者がやろうとしたらできる事。
209デフォルトの名無しさん:2011/02/25(金) 00:57:04.80
>>207
貴様はMonoとvalaを侮辱したな…
.netはプラットフォームにかなりべったりだけど、
C#自体はかなりイカした言語だと思うぜ。

そうね、Javaよか幾分マシなくらいな

でもこれってすごい事よ。
210デフォルトの名無しさん:2011/02/25(金) 01:17:10.24
C++でメモリ周りに辟易したらC#良いよ。インターフェース思考のものがザクザク作れる。
まー、最近だとC++でもスマートポインタ入っていくらかマシになったけど。
211デフォルトの名無しさん:2011/02/25(金) 02:27:34.70
>>204
5年後だと0F超えてるw
212デフォルトの名無しさん:2011/02/25(金) 03:34:21.82
>>198
phpに統一したい、C++を使いたいってことでいいのかな。
なら、phpのモジュールをC++で書けばおk。
213デフォルトの名無しさん:2011/02/25(金) 03:36:43.61
xに何が入るかを考えるなんて思考停止の極み。36進数または62進数であるとは考えないのか
214デフォルトの名無しさん:2011/02/25(金) 04:02:10.06
>>213
n進数としてn→∞ならあらゆる自然数を10-1で表現できるもんなぁ…。
215デフォルトの名無しさん:2011/02/25(金) 09:12:44.67
>>208
PHP は処理系が一つしか無い訳だから、それは当て嵌まらない。
現実を無視して、過度な一般化をしても意味は無い。
216デフォルトの名無しさん:2011/02/25(金) 09:44:55.45
設計の相談です。

現在、次の法則でコンテナが増えていってます。

std::vector<AClass> aList;
std::vector<BClass> bList;
std::vector<CClass> cList;

exec1(){
for_each(aList.begin(),aList.end(),std::mem_fun_ref(&AClass::exec1));
for_each(bList.begin(),bList.end(),std::mem_fun_ref(&BClass::exec1));
for_each(cList.begin(),cList.end(),std::mem_fun_ref(&CClass::exec1));
}
exec2(){
for_each(aList.begin(),aList.end(),std::mem_fun_ref(&AClass::exec2));
for_each(bList.begin(),bList.end(),std::mem_fun_ref(&BClass::exec2));
for_each(cList.begin(),cList.end(),std::mem_fun_ref(&CClass::exec2));
}

10個20個と、今後もこの法則で増えていきそうなので、
コンテナ自体をコンテナに詰め込んでまとめてexe1(),exe2()などを呼ぼうかと
思ったんですが、よく考えると、型が違うのでコンテナに入れられないですよね。

すっきりする方法ってありますでしょうか?
217デフォルトの名無しさん:2011/02/25(金) 10:11:10.34
class Base{
public:
virtual ~Base(){}
virtual void exec() = 0;
};
class AClass : public Base
{
public:
virtual void exec()
{
}
};
std::vector<Base*> aList;
これでは?
218デフォルトの名無しさん:2011/02/25(金) 13:09:28.31
わざわざコードまで書いていただいて有難うございます!

実は、newを使う実装に抵抗があってずっと避けていたのですが、
確かに構造的にはスッキリしそうですね。

これを機に、スマートポインタを使って
ご提案いただいた方法で挑戦してみます!

有難うございました。

219デフォルトの名無しさん:2011/02/28(月) 12:50:58.96
デフォルト引数でポインターではないクラスを初期化する方法ないんですか?
220デフォルトの名無しさん:2011/02/28(月) 12:52:56.62
>>219
どのレベルで言ってるか良くわからないが、初歩であれば、

CHoge Hoge(Arges);

って言う感じじゃね?コンストラクタもそれように書く!
221デフォルトの名無しさん:2011/02/28(月) 12:54:44.59
>>219
ありますよ。
class C { public: C(int v = 0) {} };
222デフォルトの名無しさん:2011/02/28(月) 13:35:44.38
えっ、違いますよ。
void function (Class Cデフォルト(引数)){}
のようなことですよ?
223デフォルトの名無しさん:2011/02/28(月) 13:40:08.04
void function (int a=3 ,Class C(デフォルト引数)){}
訂正
224デフォルトの名無しさん:2011/02/28(月) 13:50:29.87
>>222-223
△ デフォルト引数でポインターではないクラスを初期化
○ ポインターではないクラス型の引数にデフォルト実引数を指定
ってことかな?

void function (int a=3 ,class C = C(...)){}
225デフォルトの名無しさん:2011/02/28(月) 13:53:51.21
>>224
ありがとうございます。
たぶんそれですが
初期化してからコピーで、厳密には初期化じゃないですよね。
226デフォルトの名無しさん:2011/02/28(月) 13:55:55.06
>>225
コピーじゃないよ。 operator = () が呼び出されたりはしない。
227デフォルトの名無しさん:2011/02/28(月) 13:59:02.59
えーーっ、じゃあ、イニシャライザーなんて必要なくね?
228デフォルトの名無しさん:2011/02/28(月) 14:03:19.95
なんでそうなるかな?
229デフォルトの名無しさん:2011/02/28(月) 14:15:49.39
>>226
コピーされるかどうかの話ならコピーコンストラクタが使われるかどうかを確認するべきでしょう。
230デフォルトの名無しさん:2011/02/28(月) 14:20:37.93
引数で実体を渡すとなると、一度呼び出し元の関数上でオブジェクトを構築してから、コピコンで呼び出し先の関数に渡すんじゃない?
デフォルト引数は呼び出し元の引数の記述を省略できるだけで、動作に変化はないんじゃない?
規格は確認してないけど
231デフォルトの名無しさん:2011/02/28(月) 17:27:15.17
コピーされたくない場合は参照で渡せばよかとよ
232デフォルトの名無しさん:2011/02/28(月) 17:37:56.02
class C = C(...)
こう書いたとき、operator =() は呼ばれず、代わりにコピーコンストラクタが呼ばれる可能性がある
その上で、コピーコンストラクタを呼び出す処理を省略する実装が許されている、だっけ?

ちなみに参照のときってこう書けばいいの?
void function (int a=3 ,class &C = C(...)){}
233デフォルトの名無しさん:2011/02/28(月) 17:47:05.12
とりあえず、コピーコンストラクタの呼び出しとコピー代入演算子の呼び出しを
同じ「コピー」と呼ぶのはやめよう。ちなみにゆとりちゃんの勤めている会社はポプー。

C c;
C a( c ); // コピーコンストラクタの explicite な呼び出し
C a = c; // コピーコンストラクタの implicite な呼び出し
a = c; // コピー代入演算子の呼び出し

void f( C x = C() );
f( c ); // x はコピーコンストラクタの explicite な呼び出しで生成
f() // x は引数なしのコンストラクタの呼び出しで生成

見た目が同じでも意味が違うのであった。
234デフォルトの名無しさん:2011/02/28(月) 17:48:24.81
class C(...)
として扱って良いだったはず
235デフォルトの名無しさん:2011/02/28(月) 17:56:25.84
あ、ごめん。

f( c ); // x はコピーコンストラクタの implicit な呼び出しで生成

の間違いですた^^
あと、implicit, explicit でつづりも間違い^^;;;;;
236220:2011/02/28(月) 18:31:02.80
関数かいな、マジボケしてた。。。Orz
237デフォルトの名無しさん:2011/02/28(月) 19:03:20.86
>>234
ありがとう。

MyClass foo = MyClass();
と書いたとき、下記のいずれで実装してもよい、ですね。
・コンストラクタ + 代入演算子
・コピーコンストラクタ
238デフォルトの名無しさん:2011/02/28(月) 19:19:33.37
だめに決まってんだろ。
239デフォルトの名無しさん:2011/02/28(月) 19:26:40.34
>>237
だめだこりゃ
240デフォルトの名無しさん:2011/02/28(月) 19:33:44.13
次いってみよう
241デフォルトの名無しさん:2011/02/28(月) 19:35:36.93
金ダライの衝撃は80kgほどである。
242デフォルトの名無しさん:2011/02/28(月) 22:38:27.36
C99も10年以上経っているのに
いつまでもコンパイラが枯れないね
243デフォルトの名無しさん:2011/02/28(月) 22:39:22.39
C++0xは何年やってるんだっけ?
244デフォルトの名無しさん:2011/02/28(月) 23:02:51.53
現行はC++03
245デフォルトの名無しさん:2011/02/28(月) 23:04:54.08
現行はね。
246デフォルトの名無しさん:2011/03/01(火) 17:38:46.26
7,8年前?に読んだC++入門本なんですが、なんだったかのか思い出せません。
少なくとも2分冊、恐らく3分冊で、1冊が5cmほどで、カバーを外すと1冊が緑一色、1冊が青一色。
多分洋書の和訳。
STLについても書いてあったはず。
なんかうさぎと亀のシミュレーションとか、アキュムレータマシン(か、レジスタマシン)の仮想マシンとか書いてあったような。
すっごい面白かったはずなんですが、誰か書名を教えてくれませんか?
247デフォルトの名無しさん:2011/03/03(木) 17:37:08.59
ひとつの関数を作るためだけに使い捨てのクラスを作ることってありますか?
Cで書くのと同じように関数内にゴリ押しで詰め込んだほうがいいですか?
248デフォルトの名無しさん:2011/03/03(木) 17:39:19.11
テンプレート使ってるとそんなヘルパクラスは山ほどできるよ。
249デフォルトの名無しさん:2011/03/03(木) 18:24:57.05
>>247
関数は作る。
クラスを作るかどうかは状況による。
使い捨てのクラスを作ることはない。
250デフォルトの名無しさん:2011/03/10(木) 03:31:41.35
std::absがテンプレートだと思ってint64_tを食わせたときの絶望感はひどい。。。@VC10EE
251デフォルトの名無しさん:2011/03/10(木) 03:42:39.95
と、思ったら俺の勘違いだった。おかしなことかいてすまねー。
252デフォルトの名無しさん:2011/03/10(木) 19:19:48.69
質問です。

http://ideone.com/ZdhCm
関数に渡す引数を柔軟にしたく、
コンストラクタの暗黙変換を活用するコードを書いたのですが、
テンプレート引数の型が派生関係にある型では
マッチしてくれないことが分かり困っています。

こういった場合の一般的な解決方法がありましたら教えてほしいです。
253デフォルトの名無しさん:2011/03/10(木) 19:32:02.79
template<class T> void Func(T const & obj);
254252:2011/03/10(木) 19:56:15.58
>>253
ありがとうございます。が大変申し訳ないです説明不足でした。
引数を柔軟にというのは、複数の型から変換できるという意味合いです。
http://ideone.com/BxMks

・・ってああああ!分かってきました!
曖昧にしておきたいテンプレート引数に当たる部分は一旦Tで受けておいて、
更にそのTを関数オーバーロードを利用して具体的な型に近づくように
振り分けてあげれば良さそうですね!
・・ただこれって結構深いテンプレート深度だと書くの大変そうですよね。
これから試してみようと思いますが、このやり方しか方法は無いんでしょうか?
255デフォルトの名無しさん:2011/03/10(木) 19:59:25.78
Wrapperにインターフェイスを定義したベースクラスをくっつけてやればいいんじゃないの?

class BaseWrapper{ }

template <class T>
struct Wrapper : public BaseWrapper { };

struct Hoge { };


void Func(const BaseWrapper& arg)
{
}
的な。
256252:2011/03/10(木) 21:04:01.65
>>255
ありがとうございます。ただ、意図しているところがちょっと分かりませんでした。
全ては私の説明が下手なせいで・・ごめんなさい。

一応>>254での方法で振り分けができたのですが、
なんだか多分スマートではない感じになりました・・。
http://ideone.com/svWr7
これで進めてみますが、もっと良い感じの
コードがありましたら教えてほしいと思います。

一旦これにて、皆さんどうもありがとうございました。
257デフォルトの名無しさん:2011/03/10(木) 21:49:04.99
>>256
ImplicitCasted Convert(int);
ImplicitCasted Convert(Hoge const &);
ImplicitCasted Convert(Wrapper<Hoge> const &);
template <class T> ImplicitCasted Convert(Wrapper< HogeHoge<T> > const &);

template <class T> void Func(T const & obj) {
  ImplicitCasted const & ic = Convert(obj);
}

キャストなんてどうしようもない時だけにするものだから
キャストしまくる前提のクラス設計なんて最初から見直したほうがいい、と言いたいけど…
まあ、どうしてもやりたいなら、俺ならこうする
258デフォルトの名無しさん:2011/03/12(土) 07:58:40.12
問を1つ。

継承なしに関数のオーバーライドって可能ですか?

つまり「 : public ClassName」を使わないで。
259デフォルトの名無しさん:2011/03/12(土) 08:18:09.52
つまり: protected ClassNameならいいと
無理じゃね
260デフォルトの名無しさん:2011/03/12(土) 09:15:36.17
いや、:〇〇を使わずにw

さらに、サブクラスにスーパークラスのヘッダーファイルをインクルードも禁止なのです
261デフォルトの名無しさん:2011/03/12(土) 09:35:47.58
継承なしで似たことができたとしてもそれはオーバーライドとは呼ばないので
262デフォルトの名無しさん:2011/03/12(土) 11:40:51.21
たまたま見つけてしまったから、既出の技術か確かめたかったのです。
身近に相談出来るプログラマーなんていないからw
263デフォルトの名無しさん:2011/03/12(土) 12:17:09.97
同じようなことは出来るだろうけどオーバーライドとは呼ばないし移植性もなくなるだろうな
264デフォルトの名無しさん:2011/03/12(土) 18:43:18.75
静的多態はオブジェクトの型に応じて呼び出し関数を上書きはするけど
オーバーライドの機能をすべて実現することはできないしね。

あと、C++のときはサブクラス、スーパークラスと呼ぶのはやめようぜ。
なんか肛門がぞくぞくする。
265デフォルトの名無しさん:2011/03/13(日) 01:39:30.91
>>262
その見つけたコードを書いてみるといいよ。
266デフォルトの名無しさん:2011/03/13(日) 02:31:20.47
意味わかんないけど、関数ポインタ使ってじゃないよな?
267デフォルトの名無しさん:2011/03/13(日) 02:45:32.23
関数ポンタなら使ってます
268デフォルトの名無しさん:2011/03/13(日) 09:09:48.64
関数ポインタ使った実装とオーバーライドを同一視するとか初心者かっての
269デフォルトの名無しさん:2011/03/13(日) 12:00:09.24
COMみたいな実装ならそれを言語で自動的にやってくれるようにしたのが
仮想関数システムなわけだが。
継承関係の無いクラスの動的多態、ならFaith and Braveで記事があったと思う。
270デフォルトの名無しさん:2011/03/13(日) 12:59:41.45
C++の仮想関数は関数解決に仮想関数テーブル使ってるから、単純な関数ポインタでは同じ実装はできなよ。
271デフォルトの名無しさん:2011/03/13(日) 13:03:01.32
なよw
272デフォルトの名無しさん:2011/03/13(日) 14:08:48.06
なよなよ
273デフォルトの名無しさん:2011/03/13(日) 15:22:37.69
情報サンキュー。
もう少し正確な裏付け取るため別をあたってみたいと思います。
コード公開できるようになれば報告しに来ます!(`・ω・´)

因みに267は俺の発言ではないのです。そして関数ポインタなんて使ってませんw
274デフォルトの名無しさん:2011/03/13(日) 16:04:34.93
std::dequeは末尾の削除以外の要素追加/削除を行ったらiteratorが無効になるとありますが、
dereferenceした直接の要素へのポインタや参照もstd::vectorみたいに無効になるんでしょうか?

推測ですが、iteratorが無効になるのはランダムアクセスに使っているindexの配列の再構築が行われるからであって
要素そのもののメモリ空間の操作はないと思うのですが、実際はどうなんでしょう。
275デフォルトの名無しさん:2011/03/13(日) 17:31:16.24
>>274
「dequeはイテレータが無効になってもポインタや参照は無効にならない」
とEffectiveSTLに書いてあるけど。
つーわけで、Eff STLは持っとけ。
276デフォルトの名無しさん:2011/03/13(日) 17:54:04.11
>>275
ありがとうございます。
277デフォルトの名無しさん:2011/03/14(月) 14:06:09.74
substr関数を使わずにポインタを弄るだけで文字列 "12345"を"1234"または"2345"に変える方法ってあるの?
278デフォルトの名無しさん:2011/03/14(月) 16:43:08.32
\0使え
279デフォルトの名無しさん:2011/03/15(火) 00:40:02.46
void func(char * buf, char const * str, unsigned len, unsigned offset)
{
sprintf(buf, "%*.*s", len, len, str + offset);
}

char buf[100];
func(buf, "12345", 4, 0);
puts(buf);
func(buf, "12345", 4, 1);
put(buf);
280デフォルトの名無しさん:2011/03/15(火) 19:24:19.32
> unsigned len, unsigned offset

順番がキモい
281279:2011/03/16(水) 04:23:51.03
すまん、寝惚けてたんだと思う。
282デフォルトの名無しさん:2011/03/17(木) 04:27:04.07
>>275
vectorみたいに再配置が起きないの?
dequeってメモリ上連続していることが保証されてるんじゃないっけ。
283デフォルトの名無しさん:2011/03/17(木) 04:28:24.25
ごめん勘違いだった。
284デフォルトの名無しさん:2011/03/17(木) 17:25:17.40
>>282
連続してねえよ
チャンク単位でバラバラ
operator[]が使えるってだけの話
285デフォルトの名無しさん:2011/03/17(木) 19:02:32.27
ですね。ごめんなさい。
[]が定数時間でアクセス可能というところで、データ自体が連続領域なのかと勘違いしてた。
286デフォルトの名無しさん:2011/03/17(木) 19:16:05.37
即座に勘違いだったと撤回してるのに13時間後にドヤ顔で突っ込む男の人って・・・
287デフォルトの名無しさん:2011/03/17(木) 19:25:13.99
ヘッダに、
static void Func()
{
static char buffer[1024];
}
と書いて複数のcppからインクルードすると、
staticなので内部リンケージということから考えて、
関数が複数コピーされて、
buffer[1024];は静的領域に複数確保されてしまいますか?
288デフォルトの名無しさん:2011/03/17(木) 21:16:49.16
はい。
289デフォルトの名無しさん:2011/03/17(木) 23:54:34.96
>>288
ありがとうございます。
290デフォルトの名無しさん:2011/03/18(金) 01:46:49.96
C++って何でも出来るらしいけど何にも作れない。。。
例えばPythonとかだったらFTP鯖とかftplibモジュールとか使えばすぐ作れたりするけどC++だと全然どうやって作っていけば良いのか分からん。
入門書読み終えて立ち尽くしてる状態だわ
291デフォルトの名無しさん:2011/03/18(金) 02:09:29.38
C++だけじゃ無理だな
OSの力を借りないと
292デフォルトの名無しさん:2011/03/18(金) 09:21:00.53
ライブラリの力を借りてみよう
特にネットワークは環境依存プログラミングになりがちだから、
とりあえずクロスプラットフォームのライブラリさがすのベターでは
293デフォルトの名無しさん:2011/03/18(金) 11:54:53.17
>>291-292
どうもありがとう。
言語の勉強するんならとりあえず何か作れと良く言われるからDXライブラリとか外部のライブラリ使って何か作ってみる
294デフォルトの名無しさん:2011/03/18(金) 13:45:05.74
>>290
> C++って何でも出来るらしいけど何にも作れない。。。
真理。
295デフォルトの名無しさん:2011/03/18(金) 13:45:54.15
>>293
> DXライブラリ
Qtライブラリがおすすめな気がするけど。


DXもまあ勉強するならいいのかもしれないが、クロスプラットフォームじゃないしねぇ。
環境依存が強すぎる気がする。
296デフォルトの名無しさん:2011/03/18(金) 17:05:38.55
>> C++って何でも出来るらしいけど何にも作れない。。。
>真理。

足りない言葉がある。
C++って普通の人間なら何でも出来るらしいけど、馬鹿には何にも作れない。。。
297デフォルトの名無しさん:2011/03/18(金) 17:16:00.11
C++は専門職のための仕事道具だって禿も言ってるしな。
298デフォルトの名無しさん:2011/03/18(金) 23:22:40.63
専門職じゃなくても、あれこれ要求あげていくと、結局C++になったり
似たような言語ありそうで、ないんだよな
D言語には、代替として凄く期待していたんだけど、いつまでも「乞うご期待」だし
299デフォルトの名無しさん:2011/03/18(金) 23:33:50.70
>>298
> 似たような言語ありそうで、ないんだよな
そうそう。
C++は結局逃れられないのだ。

300デフォルトの名無しさん:2011/03/19(土) 02:09:31.48
>>290
通信の勉強をして、次に、FTPのRFCをよんで、仕組みを理解したら徐々に作っていく
既存のライブラリで済ませるんなら、そっち方面をあさるのもいい

でも自前で作るのって相応の理由がないと、大抵損だよ。
301デフォルトの名無しさん:2011/03/19(土) 03:16:03.52
const_cast の存在理由が分からないです。
const っていうのは、理由があって書き換えられないようにするために付けるものだと思いますが、
こんなキャストがあるおかげで、結局はconstを外せてしまい、constの意味がなくなってしまうのでは。
それにconstを外すなんて、どう考えてもバグの元だと思うのですが。
「constは絶対に外せない」とした方が良くないですか?
302デフォルトの名無しさん:2011/03/19(土) 03:50:43.82
>>301
constメンバ関数と非constメンバ関数を一つにまとめる時とか
303デフォルトの名無しさん:2011/03/19(土) 04:31:18.52
const を付ける為だけに使えば無問題
304デフォルトの名無しさん:2011/03/19(土) 09:59:15.09
>301
基本的には使わないと思っておけばいいよ。
良くあるケースは提供されたライブラリに、引数を変更しないのに const ついてない関数があって
ライブラリ側のソースが直せないけど渡したいケースとか。
理想としては const_cast なくてもいいはずだけど現実的には難しいって感じ。

あるいはライブラリ外部に対しては const として公開しておいて内部では const 外して処理するとか
いう使い方もあるみたい。
305デフォルトの名無しさん:2011/03/19(土) 10:50:15.06
>>303
付けるほうは static_cast にしてください。
そんなのが const_cast の検索にひっかかるとウザイ。
306デフォルトの名無しさん:2011/03/19(土) 13:58:09.43
static_castが万能なのはどうにかならなかったのかな
検索に引っかかりすぎてウザイ
307デフォルトの名無しさん:2011/03/19(土) 15:37:02.28
>>305
本気? 危険じゃね?
308デフォルトの名無しさん:2011/03/19(土) 15:56:21.33
非const→constはキャストいらないだろ
309デフォルトの名無しさん:2011/03/19(土) 16:00:46.92
禿本には「キャストが必要になるのは悪い兆候なので注意せよ」と書いてあるしな
310デフォルトの名無しさん:2011/03/19(土) 16:29:01.91
T const *pc = p;
pc->f();

とするか

const_cast<T const*>(p)->f()

とするかみたいな話では。
常に前者で書くなら const_cast は要らないかもね
311デフォルトの名無しさん:2011/03/19(土) 16:34:19.94
最初から>>302が書いてくれてるけど

iterator begin() {...}
const_iterator begin() const {
return const_cast<T*>(this)->begin();
}

みたいな時に使う感じ
312デフォルトの名無しさん:2011/03/19(土) 18:18:23.20
>>307
constつけるのにも毎度毎度const_cast書いてたの?
313デフォルトの名無しさん:2011/03/19(土) 18:58:13.10
「危険なことは言語仕様でできないようにしてほしい」と思うなら
単純にJavaみたいな思想の言語を使えばいいだけなんだよ。

言語ごとにパラダイムが違うんだから適材適所でいいんだよ。
C++もJavaと一緒にされちゃったら存在価値なくなっちゃう。
314デフォルトの名無しさん:2011/03/19(土) 20:01:02.49
>>310 前者じゃなくても static_cast でいいんだってば。
315デフォルトの名無しさん:2011/03/19(土) 20:24:19.18
cv修飾を変えるだけの用途であっても static_cast を使うべき
と言ってるのかな
論拠はなんなのだろう
316デフォルトの名無しさん:2011/03/19(土) 20:41:29.25
>>315
const_cast は危険な操作をそうとわかるように表記するために作られた。
しかし const の付加はそのような危険な操作ではない。
const の付加に const_cast を使うと、 const_cast をキーワードとして
危険な操作を探した場合にノイズとして引っかかる。
安全な操作であるぶん数も多くなり、本来の目的であった危険な操作を
見つけることを難しくしてしまう。
317デフォルトの名無しさん:2011/03/19(土) 20:50:55.03
constを加えるならconst_castを使わず常に310の前者のように書け
というならOK
でもそれなら static_cast 関係無くね?
318デフォルトの名無しさん:2011/03/19(土) 20:59:32.07
>>317
const を加えただけのポインタや参照に名前を付けたくないとき、 static_cast で済ませることがある。
>>311 とは逆に↓とか。
X const& f() const {...}
X& f() { return const_cast<X&>(static_cast<T const&>(*this)->f()); }
319デフォルトの名無しさん:2011/03/19(土) 21:22:56.75
細かいことだが
実際の定義はconstでやる方(>>318)が正解
逆は良くない
なぜならconst_cast<T*>(this)の時点でconstなメンバが変更される余地を残してしまうから
EffectiveC++より
320デフォルトの名無しさん:2011/03/19(土) 22:02:19.53
>>318 それ const_cast でいいよね
321デフォルトの名無しさん:2011/03/19(土) 22:03:50.20
だめだよ
322デフォルトの名無しさん:2011/03/19(土) 22:20:42.39
static_cast でcv修飾を加えることは出来るけど、それなら const_cast の方が
安全で意味を直接に表現出来る。
static_cast でcv修飾を除くことは出来ないから、その場合 const_cast を使うしかない。
323デフォルトの名無しさん:2011/03/19(土) 23:03:58.84
>>320
static_cast より const_cast が安全だ、あるいは逆に static_cast のほうが危険だという理由は何?
意図しない const/volatile の除去が発生する可能性のある const_cast のほうが明らかに危険じゃないか?
324デフォルトの名無しさん:2011/03/19(土) 23:28:25.82
すまんが釣りにしか見えんのよ
325デフォルトの名無しさん:2011/03/19(土) 23:54:10.63
const_cast< T const * & >( p )->f(); // やった!一時オブジェクトを作らなくてすんだぞ^^
326デフォルトの名無しさん:2011/03/20(日) 00:03:37.97
ここによると
ttp://msdn.microsoft.com/ja-jp/library/cc440192%28VS.71%29.aspx
「static_cast は C++ の道具の中で最も危険なツールの1つであり、ほかのすべての方法でうまくいかないときに限り使うべきである」
とある。あと↓とか
ttp://stackoverflow.com/questions/4954865/any-reason-to-prefer-static-cast-over-a-chain-of-implicit-conversions
うっかりミスをしたら危険なのは static_cast も同じ。
static_cast でcv修飾を誤って除くことは無いということは確かだから
俺がstatic_castでうっかりミスするなんて決してないに決まってるだろクソが
というなら static_cast 使えばいいんじゃね。別に誰も止めんよ
327デフォルトの名無しさん:2011/03/20(日) 00:13:31.78
>>326 >>323
あと、 stackoverflow のリンク先は const_cast との比較ではないから関係ない。
328デフォルトの名無しさん:2011/03/20(日) 00:18:06.82
>>326
http://msdn.microsoft.com/en-us/library/5f6c9f8h.aspx
> Use const_cast and reinterpret_cast as a last resort, since these
> operators present the same dangers as old style casts.
329デフォルトの名無しさん:2011/03/20(日) 00:31:14.94
>>326
>static_cast は C++ の道具の中で最も危険なツールの1つであり、
ここ誤植じゃないでしょうか。
reinterpret_castの項目で、static_castの危険性を(より危険なreinterpret_castを引き合いに出して)説明してるのに違和感が・・・

>どちらの形式でも正常に動作するという場合でも、私はやはり reinterpet_cast の使用を推奨します
( ´゚д゚`)エー
330デフォルトの名無しさん:2011/03/20(日) 00:35:41.73
>>329
http://www.google.co.jp/search?q=%22static_cast+%E3%81%AF+C%2B%2B+%E3%81%AE%E9%81%93%E5%85%B7%E3%81%AE%E4%B8%AD%E3%81%A7%E6%9C%80%E3%82%82%E5%8D%B1%E9%99%BA%22
もう確認できないが、ログによると英語の原文でも同じだったらしい。

まぁ原文が Google 検索で確認できなくなってる事実からも、
あまりよくない文書だったんだろうと推察できる。
331デフォルトの名無しさん:2011/03/20(日) 00:54:06.57
317にもあるけどconst_castを使わず暗黙の変換を使え、なら分かるんだが
static_cast と const_cast なら static_cast を使うべき、という主張なのだろうか
目うんこと鼻うんこに感じるんだけど
332デフォルトの名無しさん:2011/03/20(日) 01:03:45.66
int* p = NULL;
if( p )
とやるのと
if( p != NULL )
とやるのはどっちがいいですか?
333デフォルトの名無しさん:2011/03/20(日) 01:21:29.87
俺は、static_cast と reinterpret_castだったら後者のほうが怖いけどね。
334デフォルトの名無しさん:2011/03/20(日) 01:24:25.30
>>332
せめてC++だったらNULLではなくて0を使おうよー
C++0xならnullptrを
335デフォルトの名無しさん:2011/03/20(日) 01:28:11.45
0はキモイからいやだ
336デフォルトの名無しさん:2011/03/20(日) 01:34:06.60
バイナリ値をもとに式を組みかつ挙動を把握し切れてない人にとってはstatic_castが厭らしい問題を引き起こす厄介者に思えるのかもしれん。
337デフォルトの名無しさん:2011/03/20(日) 03:07:16.05
遅ればせながら…

struct A : B, C {...

void C::f() {
 static_cast<A const*>(this)->f(); // 未定義動作
}

間違えば static_cast でも未定義動作なのは同じでしょう。
「俺はそんな間違いをする筈無い」ということなんだろうけど
それは const_cast も同じ。
static_cast も const_cast も危険で注意すべき箇所という事に
違いは無いと思う。
338デフォルトの名無しさん:2011/03/20(日) 03:29:48.02
>>329-330
だいぶ前にもその記事出たんだけど、
記事自体が古い上に、Effective C++のメイヤーや、Exceptional C++のサッターとかから
「何いってんだ、クソが」みたいな投稿があって、フォーラムだかコメントだかで論争になり、
結論として「ごめんよ、ビット列をそのまま解釈するreinterpret_castの方がやっぱキケン」
って次のコラムで論争の内容をまとめた上で謝ってたように思う。
339デフォルトの名無しさん:2011/03/20(日) 03:32:06.78
C++ではCのNULL( void*(0) )と同じ動作しないしね。
詳しくはEffective C++に載ってたはず。
340デフォルトの名無しさん:2011/03/20(日) 03:46:24.87
>>331,337 >>316
341デフォルトの名無しさん:2011/03/20(日) 03:48:40.48
>>332
元の意図である「p がヌルじゃなかったら」に近い後者のほうが読みやすい気がする。

でも NULL を使うためにヘッダのインクルードが必要になるのはダルイので、 0 か、
可能なら nullptr を使うのがいい。
342デフォルトの名無しさん:2011/03/20(日) 03:50:33.08
343デフォルトの名無しさん:2011/03/20(日) 04:20:12.52
>>340
static_cast も const_cast も危険な操作として後から探すと思うんだけど
見つかった static_cast なり const_cast が const を足すだけだった
と分かって紛らわしいということだよね?
static_cast を探した時に見つかるのと const_cast で見つかるのと
そんなに違うのかい?
344デフォルトの名無しさん:2011/03/20(日) 04:33:23.06
>>317>>331>>342にあったリンク先にも書いてあるけど
暗黙の変換で済むならそれに越した事は無いと思うんだよね。
342のリンク先では、どうしても使うなら static_cast の方が
まだましとあるけど、>>337にあるように、一方のキャストの
危険度が有意に高いということは無いと俺は思ってる。
const を付けるのに {static/const}_cast 使うとかプギャー
というなら完全胴衣なんだが
345デフォルトの名無しさん:2011/03/20(日) 21:19:12.15
>>343-344
たいして違わないけど全く違わないわけでもない。
暗黙変換で済ませるのがベストなのはみんなわかってるだろう。
346デフォルトの名無しさん:2011/03/20(日) 21:33:03.97
new演算子はスレッドセーフですか?
347デフォルトの名無しさん:2011/03/20(日) 21:42:46.32
>>346 実装依存です。
348デフォルトの名無しさん:2011/03/20(日) 21:52:08.24
>>347
ありがとうございます。
仮にスレッドセーフではないと仮定するならば、
複数のスレッドでnewが入る場合は、
newが行われるスレッドが動いている間、
必ずすべてのnewで排他制御が必要になるということですか?
349デフォルトの名無しさん:2011/03/20(日) 21:54:48.75
>>348
未規定とはそういうこと
350デフォルトの名無しさん:2011/03/20(日) 22:19:52.94
>>349
なるほど・・・
すべてのnewで排他制御の他にスレッドセーフへのアプローチ方法はありますか?
351デフォルトの名無しさん:2011/03/20(日) 22:50:23.33
スレッドセーフなAllocator渡すのが普通じゃないかな
352デフォルトの名無しさん:2011/03/20(日) 22:51:11.95
自分で ::operator new をそのように実装するとか
353デフォルトの名無しさん:2011/03/20(日) 22:55:43.25
ありがとうございます。
>>351
やはりそのあたりが現実的でしょうか
>>352
仮にoperator new をしてもすべてのnewをのっとれるわけではないですよね?
354デフォルトの名無しさん:2011/03/20(日) 22:58:52.67
VC++だとスレッドセーフ版とそうじゃないのを選択できるよね
GCCはよく知らん
355デフォルトの名無しさん:2011/03/20(日) 23:03:11.23
>>350
スレッドが動く環境のコンパイラなら new なり malloc なりの下位層で対応済みなことがあるから、
まずは環境についてのドキュメントを確認したほうがいいんじゃないか?
356デフォルトの名無しさん:2011/03/20(日) 23:08:07.30
>>355
そうですね、ありがとうございます。
357デフォルトの名無しさん:2011/03/21(月) 22:01:14.81
文字列に数字(2桁以上を含む)とアルファベットが混ざっていて、
"ab100cd33e"
=>
a
b
100
c
d
33
e

という感じに、数字はまとめて配列か、tupleに入れてくれるようなライブラリはないでしょうか。
また、近い使い方が出来るものも無いでしょうか?
現状、istringstreamのget()メソッドで一文字ずつ取り出して自力で解析するコードが見難くて困っています。
358デフォルトの名無しさん:2011/03/21(月) 23:47:35.32
#include <algorithm>
#include <iostream>

#include <boost/xpressive/xpressive.hpp>

int main()
{
using boost::xpressive::digit;
using boost::xpressive::alpha;

std::string input("ab100cd33e");

boost::xpressive::sregex token = +digit | alpha;

boost::xpressive::sregex_token_iterator begin(input.begin(), input.end(), token);
boost::xpressive::sregex_token_iterator end;

std::vector<std::string> array(begin, end);

std::ostream_iterator<std::string> output(std::cout, "\n");
std::copy(array.begin(), array.end(), output);
}

こんなんでどうよ
359デフォルトの名無しさん:2011/03/21(月) 23:55:01.12
おっと…上のほうに

#include <string>
#include <vector>
#include <iterator>

を足しといて
360デフォルトの名無しさん:2011/03/21(月) 23:56:35.65
boost::tokenizerで別途連結する文字集合に0, ..., 9を入れればできるよ。
361357:2011/03/22(火) 00:40:24.42
>>358
カッコ良過ぎる・・・
ありがとうございます。
こういうC++的な書き方は非常に参考になります。

>>360
boost::tokenizerで出来ないか丁度検討してました。
可能だと分かり、助かります。ありがとうございます。
362デフォルトの名無しさん:2011/03/25(金) 20:26:20.32
class A {
 int i;
 class B {
  B(){
   //ここでA::iにアクセスする方法ありますか?
  };
 }
 A(){
  B b;
  
 };
};
上にような構造のクラス作る時、外側のクラスの変数に簡素にアクセスする方法があれば教えてください
やはりBのコンストラクタあたりでiを渡さないといけませんか?
わかりにくかったらすいません
363デフォルトの名無しさん:2011/03/25(金) 21:58:57.09
AのインスタンスをBに渡せばいいだけの話。
364デフォルトの名無しさん:2011/03/25(金) 22:54:32.58
最低でも
A::A(){
  B b(this);
}
のように渡さないといけないということでしょうか
言語的に外側のクラスから引っ張ってくるようなことはできないのでしょうか
365デフォルトの名無しさん:2011/03/25(金) 22:59:17.96
>364
少しは自分の脳みそで考えてみろ。
A::B というクラスは A とは独立して存在するんだが、どの A オブジェクトの i をアクセスするというんだ。
366デフォルトの名無しさん:2011/03/25(金) 23:29:29.61
うつ病で海馬がやせているんです…ごめんなさい;ω;
367デフォルトの名無しさん:2011/03/25(金) 23:29:33.99
うつ病で海馬がやせているんです…ごめんなさい;ω;
368デフォルトの名無しさん:2011/03/25(金) 23:30:29.22
クラスの中にクラス入れても独立させても名前空間の違いしかないということなのですね
何かアクセスする方法ができるのだと思っていました
369デフォルトの名無しさん:2011/03/25(金) 23:32:05.59
i を性的変数にすればアクセスできるよ。
370デフォルトの名無しさん:2011/03/25(金) 23:34:06.07
桁指定の0詰めをしたいけど
cout << setw(4) << setfill('0');
cout << 0 << endl;
cout << 0 << endl;
とかくと"0000", "0" となります。
1回の設定で全部のcoutに桁指定0詰めをさせる方法はありませんか?

cout << setw(4) << setfill('0') << 0 << endl;
cout << setw(4) << setfill('0') << 0 << endl;
と書くとオーバーヘッドがありそうで…。
371デフォルトの名無しさん:2011/03/26(土) 01:00:20.98
>>370
素人め!そんな軟弱なCPU使ってるのかよ。と突っかかってみる。

まー、それくらいのオーバーヘッドはたいしたこと無い。
それより、その設定を残してプロジェクトで混乱起こすよりましじゃね?
372デフォルトの名無しさん:2011/03/26(土) 01:25:23.91
>>370
std::printfを使えばよい。cout使う奴はあほ
373デフォルトの名無しさん:2011/03/26(土) 01:42:44.57
>>370
フラグでORを取っておいてsetfを使うといいのでは?
全部のcoutという表現は正しくない
一度出力を終えるとリセットされてしまうフラグとそうでないフラグがあるだけの話
374デフォルトの名無しさん:2011/03/26(土) 02:26:36.71
スタックに作ったオブジェクトをvectorに入れていくのと
ヒープに作ったオブジェクトをvectorに入れていくので
前者の方が手間がかからないと思うのですが
後者のメリットは何ですか。
375デフォルトの名無しさん:2011/03/26(土) 02:53:08.93
お前にC++はむり
376デフォルトの名無しさん:2011/03/26(土) 02:55:34.29
>>374
意味がわからない。
C++ でおk
377デフォルトの名無しさん:2011/03/26(土) 02:58:40.11
もったいぶらずに教えてくださいよ
378デフォルトの名無しさん:2011/03/26(土) 03:05:35.83
>>376
スタックに確保するアロケーターのvectorと
フリーストアに確保するアロケーターのvectorの比較だろ。
前者はすぐにメモリが解放されるので使い物にならない。
379デフォルトの名無しさん:2011/03/26(土) 03:13:16.39
string s("hoge");
vec.push_back(s);

string*p = new stirng("hoge");
vec.push_back(p);
>>374がvectorにアロケータが渡せるなんて知らないだろうからこっちの意味だろう。
380デフォルトの名無しさん:2011/03/26(土) 03:18:30.17
>>379
そういう事です^q^
381デフォルトの名無しさん:2011/03/26(土) 03:21:54.16
後者は犯罪。
382デフォルトの名無しさん:2011/03/26(土) 03:22:11.86
>>379
後者がポインタの vector なら、コピーできない(コピーのコストが高すぎる)オブジェクトにも対応できる。
そうでもなければ使う必要が無い。
383デフォルトの名無しさん:2011/03/26(土) 03:29:36.91
>>382
わかりました!!
ありがとうございます"!!
384デフォルトの名無しさん:2011/03/26(土) 10:12:02.04
>>371-373
アドバイスありがとうございます!
385デフォルトの名無しさん:2011/03/27(日) 03:30:42.33
>>360
boost::tokenizer で数字の連結なんて出来るんですか?
boost::tokenizer で数字以外の全ての文字を区切り文字に指定する方法しか思いつかないですが、
そんな方法が最善とは思えません。どうするんでしょうか?
386デフォルトの名無しさん:2011/03/28(月) 13:23:16.23
rewa
387デフォルトの名無しさん:2011/03/30(水) 14:45:41.26
コンパイル時に整数の桁数を計算する方法教えてください
388デフォルトの名無しさん:2011/03/30(水) 15:01:31.12
389デフォルトの名無しさん:2011/03/30(水) 15:02:22.05
#include <iostream>

template <int N, int M = 0>
struct hoge {
static const int keta = hoge<N/10, M + 1>::keta;
};

template <int M>
struct hoge<0, M> {
static const int keta = M;
};

int main() {
std::cout << hoge<111>::keta << std::endl;
}

自信ないけど
390デフォルトの名無しさん:2011/03/30(水) 15:04:55.22
ありがとう
391デフォルトの名無しさん:2011/03/31(木) 03:08:45.57
>>387
template<int N> struct keta { static int const value = keta<N / 10>::value + 1; };
template<> struct keta<0> { static int const value = 1; };
template<> struct keta<1> : keta<0> {};
template<> struct keta<2> : keta<0> {};
template<> struct keta<3> : keta<0> {};
template<> struct keta<4> : keta<0> {};
template<> struct keta<5> : keta<0> {};
template<> struct keta<6> : keta<0> {};
template<> struct keta<7> : keta<0> {};
template<> struct keta<8> : keta<0> {};
template<> struct keta<9> : keta<0> {};

#include "boost/static_assert.hpp"
BOOST_STATIC_ASSERT(keta<0>::value == 1);
BOOST_STATIC_ASSERT(keta<9>::value == 1);
BOOST_STATIC_ASSERT(keta<10>::value == 2);
BOOST_STATIC_ASSERT(keta<99>::value == 2);
BOOST_STATIC_ASSERT(keta<1000>::value == 4);
BOOST_STATIC_ASSERT(keta<9999>::value == 4);
BOOST_STATIC_ASSERT(keta<10000000>::value == 8);
BOOST_STATIC_ASSERT(keta<99999999>::value == 8);
392デフォルトの名無しさん:2011/03/31(木) 03:10:50.34
>>389
BOOST_STATIC_ASSERT(hoge<0>::keta == 1);
:12: error: invalid application of 'sizeof' to incomplete type 'boost::STATIC_ASSERTION_FAILURE<false>'
393デフォルトの名無しさん:2011/03/31(木) 03:19:40.57
>>387
#include "boost/mpl/if.hpp"
#include "boost/mpl/int.hpp"
template<int N> struct keta : boost::mpl::int_<1 + boost::mpl::if_c<(N < 10), boost::mpl::int_<0>, keta<N / 10> >::type::value > {};
394デフォルトの名無しさん:2011/03/31(木) 08:39:18.08
shared_ptrとunique_ptrの使い分けについて

木構造でshared_ptrを使おうと思っていたのですが、親へのポインタを持つと循環参照の問題が出てきます
回避策として親へのポインタを生ポで持たせようと思ったのですが、それではshared_ptr使う意味がない
そこでunique_ptrで寿命を管理し、生ポで参照させようとしたのですが、どうも不格好な気がします
生ポを出すと知らぬ間にdeleteされるかもしれない、でもそれはshared_ptrでもできないわけではない

こういう場合、コストを払ってでも、所有者が複数いることを明示するためにshared_ptrを使うべきでしょうか?
395デフォルトの名無しさん:2011/03/31(木) 08:49:04.35
親は子をunique_ptrで持ち、子は親の参照を持つでいいやん
396デフォルトの名無しさん:2011/03/31(木) 09:28:12.06
weak_ptrは?
397デフォルトの名無しさん:2011/03/31(木) 10:15:53.25
weak_ptrは今回のケースではどんぴしゃですね
ただ循環参照の問題はきっかけではありますが本質ではなく、
端的に言うと、スマートポインタ使用時に生ポを出すのはありなのかという疑問です
>>395が一番スマートなのでしょうか
なぜか全く思いつきませんでした

shared_ptr<int> obj1::get() {
  return ptr; // shared_ptrオブジェクトを返す コスト大
} // 一時的に使用するために呼び出す場合でもshared_ptrで返すべきなのだろうか(一時的に所有すると考えるべき?)

const int * obj2::get() {
  return ptr.get(); // 生ポを返す
} // 生ポを出すのは不格好な気がする

const int * obj3::get() { // unique_ptr<int> ptr;
  return ptr.get(); // 生ポをむき出しにするのであれば、unique_ptrでいいのでは
} // もちろんshared_ptrでなければいけないケースもあるだろうけど
398デフォルトの名無しさん:2011/03/31(木) 11:21:18.35
>>397
基本的にはナシだけど使うときは使うかな
でもCとの連絡とモニカとしての利用以外で使うことはないな

>>397の例だと
- shared_ptr<int>を返す
- const shared_ptr<int> &を返す
- (目的にあうなら)intを返す
のどれかがいいんじゃないかな

木については
- 子→親が必要ない場合は親→子だけをunique_ptrで管理
- いるならshared_ptrとweak_ptrで管理
- 平衡くさい2分木ならvector<T>(かvector<unique_ptr<T>>)で添字管理するのが楽なこともある(根は1で、左 = 親 * 2、右 = 親 * 2 + 1)
- 子が親の(C++の)参照を持つとノード削除したとき困ると思う

みたいな感じ
399デフォルトの名無しさん:2011/03/31(木) 11:41:48.48
デフォルトの引数って使いますか?
Googleスタイルだと禁止されてるんですけど
400デフォルトの名無しさん:2011/03/31(木) 11:45:09.30
使いたければ使えば
チームの意向があるならそれに従えばよろし
401デフォルトの名無しさん:2011/03/31(木) 12:07:28.06
>>399
使わない
使う上で注意しなきゃならないこともある割りにはメリットが少ないし
C#みたいに引数指定で関数呼び出せるなら便利に使えるんだろうけどね…
402デフォルトの名無しさん:2011/03/31(木) 12:54:35.08
>>398ありがとうございます、三項になりました
403デフォルトの名無しさん:2011/03/31(木) 14:34:31.18
質問です。
バイナリデータをファイルから読み込んで、メモリー上に格納する時、今までは
std::vector<byte>
を使っていました。
ただ、よく考えたら

std::vector<byte> buffer(size);
fread(fp, 1, size, &buffer[0]);

とやると、bufferの初期化時に全て0初期化されますよね。
普段は気にならないのですが、大きなデータを読み込む時にはもったいない気がします。

この初期化を行わない、バイナリデータを格納するのにふさわしい代替品は無いでしょうか?
404デフォルトの名無しさん:2011/03/31(木) 14:52:32.83
stringやnewでいいだろ。
それより初期化よりもロードが圧倒的にかかる。
細かいこと気にするな。
405デフォルトの名無しさん:2011/03/31(木) 15:03:07.07
サイズ分かってるなら固定配列でいいじゃない
406デフォルトの名無しさん:2011/03/31(木) 16:17:25.52
>>83からの流れに戻る気か
407デフォルトの名無しさん:2011/03/31(木) 16:18:34.52
>>404
stringに、'\0'が入りうるバイナリ列を入れて良いものなのでしょうか?
newですと、解放責任の問題が厄介です。

shared_arrayが最も要件を満たすようですが、スレッドセーフなど機能が大きすぎる気がします。

それっぽいstd::arrayについて調べてみましたが、こちらは新たに型を作るもののようで、型を作りたいわけではないのでミスマッチでした。
408デフォルトの名無しさん:2011/03/31(木) 16:20:47.63
stringは、charの配列。
wstringは、wchar_tの配列。
ばいなり格納可。
409デフォルトの名無しさん:2011/03/31(木) 16:22:06.08
初期化にこだわる意味がわからん。
何度も生成するなら、消さずに使い回せ。
初期化に時間食うほど確保したら、ロードはものすごくかかるだろ。
410デフォルトの名無しさん:2011/03/31(木) 16:24:02.20
10メガを100万回とかだったら、無視できないほどだろうが。アルゴリズムを見直せよ。
初期化が時間食うのは、他に何もしていないプログラムか、無駄なことをしているプログラム。
411デフォルトの名無しさん:2011/03/31(木) 16:28:02.41
freadを使うところもオーバーヘッドかかるだろ。
unixはしらんがたとえばwinapiを直に呼べばロスは減る。
412デフォルトの名無しさん:2011/03/31(木) 16:48:18.07
>>403
boostのscoped_arrayか0xのunique_ptr
413デフォルトの名無しさん:2011/03/31(木) 17:25:24.54
>>409-411
お前、レスはまとめて書けよ
あと口汚い
414デフォルトの名無しさん:2011/03/31(木) 17:39:00.65
質問です
deque(変数名Aとします)を利用して以下の条件を満たせる配列を作りたいのです
・クラスのメンバー変数である
・A[0]~A[9]を作れる
・Aはint[2]を持つ
・Aにはいくつpushされるかわからない
・A[x]に対してpushを行うと、int[2]が追加される
・A[x]の中のint[2]の各要素に代入ができる

こんな感じです
A[0]={ [0,0,0] }→A[0].push_frontする→A[0]={ [1,1,1],[0,0,0] }
→A[0].at?~[0] [0] = 2 →A[0]= { [2,1,1],[0,0,0] }

deque<int[2]>やdeque<deque<int>>では上手くpushする方法がわからず作成できないのです
もし「こうすれば上手くできる」、というのがありましたらそれでもかまいません
415デフォルトの名無しさん:2011/03/31(木) 17:50:18.39
うまくpushができない例をあげたほうがいいと思う。
なんでかっていうと、pushできるから
416デフォルトの名無しさん:2011/03/31(木) 17:55:46.22
dequeを選んだ理由もなんかあるんだろうけど、そこはさておき、
deque<deque<int> > か、deque<boost::array<int, 3> > でできると思うよ
417デフォルトの名無しさん:2011/03/31(木) 18:00:59.40
deque<クラス>にすれば混乱は少なく出来るだろう。
418デフォルトの名無しさん:2011/03/31(木) 18:03:33.80
deque<tuple<int,int,int>>a;
a.push_front(make_tuple(1,2,3));
419デフォルトの名無しさん:2011/03/31(木) 18:06:45.69
>>415
deque<int>にした場合 A[0].push_back()の時に渡す値がわからないのです。
A[0].push_back({0,0,0})とかint x[2]={0,0}A[0].push_back(x)だとエラーが出てしまって

>>416
なんかdequeが便利そうで・・・初心者なもので特に深い理由は

>>417
その発想はありませんでした
420デフォルトの名無しさん:2011/03/31(木) 18:14:44.36
>>418
調べてみたらboostみたいですね。ちょっと試してみます
421デフォルトの名無しさん:2011/03/31(木) 18:28:56.35
>>419
A[0].push_back(x)がエラーになるって書いてるけど、ほんとに?
再現コードを書いてくれないのも初心者だからですか?

deque<deque<int> > A;
A.push_back(deque<int>());
A[0].push_back(3);

これはエラーになりますか?
422デフォルトの名無しさん:2011/03/31(木) 18:49:06.66
>>421
コンパイルされたクラスの テンプレート のインスタンス化 'std::deque<_Ty>' の参照を確認してください
みたいなエラーが出ます
再現コードはこんな感じですね
Class Class
{
deque<int[2]> A[9]
};

void F(Class &Class){
int x[2]={0,0};
Class.A[0].push_back(x);
}

deque<deque<int> > A;
A.push_back(deque<int>());
A[0].push_back(3);
は上手くいきました
423デフォルトの名無しさん:2011/03/31(木) 18:56:59.57
>>422
deque<int[2]>は無理だよ。
424デフォルトの名無しさん:2011/03/31(木) 19:11:55.78
>>423
そうみたいですね

皆さんのおかげでうまくいきました。ありがとうございました!
425デフォルトの名無しさん:2011/04/01(金) 12:07:52.91
class Parent
{
  virtual ~Parent(void){}
};
class Child : public Parent
{
  void ~Child(void){}
};
class Grandchild : public Child
{
  void ~Grandchild(void){}
};

Parent *p1 = new Grandchild;
Child *p2 = new Grandchild;


上記のような構成の時、Childクラスのデストラクタにもvirtualを付けた方がいいのでしょうか?
C++の解説サイトを回ると付けている方が多いのですが、付けずにp1やp2のように使った場合でも問題なくデストラクタが呼ばれたので、どうするべきか悩んでいます。
virtualを付けること、付けないことによる不利益などありましたら、教えていただけるとありがたいです。
なお、コンパイラはVisual Studio 2008を使用しています。
426デフォルトの名無しさん:2011/04/01(金) 12:45:14.58
継承して使うつもりならつけた方がいいでしょ
427デフォルトの名無しさん:2011/04/01(金) 12:45:26.13
>>425
親がvirtualなら子も自動的にvirtualになるから付けても付けなくても一緒
付ければ見た目にわかりやすいかもしれないが、いちいち冗長で、省略できるものは省略すればいいじゃんと思う人もいる
428デフォルトの名無しさん:2011/04/01(金) 12:55:55.98
>>425
自分で理解して使う分にはいいと思うけど
仮想デストラクタでない=継承しないで欲しいの意で使う人がいるから
留意しておくといいかもしれない
429デフォルトの名無しさん:2011/04/01(金) 13:26:38.91
>>425 まず void 全部消せ
430デフォルトの名無しさん:2011/04/01(金) 14:50:58.71
関数f(int a,int b,int c)でn=0として
f(++n, ++n, ++n)とf( n++,n++,n++)
をやってみたらaから順に前者は3 3 3
後者は2 1 0だったようなあいまいな記憶があります。
なぜこうなるのか教えてください。
431デフォルトの名無しさん:2011/04/01(金) 14:54:23.50
>>430
未定義動作です。そうなるとは限りません。
http://www.kouno.jp/home/c_faq/c3.html#9
432デフォルトの名無しさん:2011/04/01(金) 18:41:20.09
C++のスレにCの話を持ってくるバカ。
433デフォルトの名無しさん:2011/04/01(金) 19:01:06.63
434デフォルトの名無しさん:2011/04/01(金) 19:20:01.45
言語仕様の話に禿のFAQを持ってくるバカ
ISO 14882はれよ
>i = v[i++]; // the behavior is unspecified
435デフォルトの名無しさん:2011/04/01(金) 19:25:35.91
「なぜこうなるのか」を訊かれてるのに言語仕様の話へすり替えるバカ
436デフォルトの名無しさん:2011/04/01(金) 19:27:28.32
こうならねーよバカって言われてるのに気付かないバカ
437デフォルトの名無しさん:2011/04/01(金) 19:31:39.50
>>435
ただのバカ
438デフォルトの名無しさん:2011/04/01(金) 19:34:25.20
未定義動作だが>>430にならないことが保障されてるとは知らなかった
439デフォルトの名無しさん:2011/04/01(金) 19:39:54.29
>>438
保証されてるとか勘違いしだすバカ
440デフォルトの名無しさん:2011/04/01(金) 19:53:13.57
>>438
対偶も分からずにプログラミングしてて大丈夫か?
441デフォルトの名無しさん:2011/04/01(金) 20:13:11.86
>>425

Parent a;
Parent b = a;

などとするとC++0xではdeprecatedになりますが
現行のC++では問題ないのでコンパイラは警告してくれません
既存コード中にこのようなものがあるかを簡単に調べるにはどうすればいいですか?
442デフォルトの名無しさん:2011/04/01(金) 20:17:41.26
コンパイラが警告だしてくれるようになるまで待つ
443デフォルトの名無しさん:2011/04/01(金) 20:30:28.68
コピー不能にすりゃエラーが出るだろう
444デフォルトの名無しさん:2011/04/01(金) 20:42:08.85
>>441 の場合はコピーコンストラクタprotectedにしとけばいいのかな??
445デフォルトの名無しさん:2011/04/01(金) 20:43:25.36
>C++0xではdeprecated
なんで?
446デフォルトの名無しさん:2011/04/01(金) 20:49:49.98
explicitにしとけばいいだろう
447デフォルトの名無しさん:2011/04/01(金) 20:55:18.24
うわっexplicitではだめです
448デフォルトの名無しさん:2011/04/01(金) 20:57:33.56
>>440
大丈夫だ。問題ない。
449デフォルトの名無しさん:2011/04/01(金) 21:00:14.84
一番いいコードを頼む
450デフォルトの名無しさん:2011/04/01(金) 21:23:11.48
451デフォルトの名無しさん:2011/04/01(金) 21:32:34.69
>>450
これは気持ち悪いな
452デフォルトの名無しさん:2011/04/01(金) 21:36:55.61
>>450
0xって、キモいな。
間違った進化を遂げているようにしか見えん。
453デフォルトの名無しさん:2011/04/01(金) 21:38:00.25
ムーブコンストラクタを導入した辺りから怪しくなったよな
高速化のため仕方がないとは言え
454デフォルトの名無しさん:2011/04/01(金) 21:44:33.72
時間がたてば心地よく見えてくるもんだろうか・・・
455デフォルトの名無しさん:2011/04/01(金) 21:45:30.14
古い機能を削ぎ落としてくれれば心地良くなる
456デフォルトの名無しさん:2011/04/01(金) 21:49:45.49
Boostのlambdaのあたりから既に文法に無理があったような
457デフォルトの名無しさん:2011/04/01(金) 21:58:07.12
C++, 0xの気持ち悪さ、嫌いじゃないぜ
458デフォルトの名無しさん:2011/04/01(金) 22:27:53.53
じきに慣れる
459デフォルトの名無しさん:2011/04/01(金) 23:03:46.51
C++、いっかい文法をすっきりさせたらいいんじゃね。
ガベコレ無しのJavaやC#みたいな感じで。
460デフォルトの名無しさん:2011/04/01(金) 23:15:02.63
互換性・・・。
461デフォルトの名無しさん:2011/04/01(金) 23:16:18.04
互換無いならC++である必要ないんだって
462デフォルトの名無しさん:2011/04/01(金) 23:17:47.42
>>459-460
その流れで、これまでいくつもの離反組が巣立っていったが
禿以上の台風の目になれた人はいまだにいないね
463デフォルトの名無しさん:2011/04/01(金) 23:18:34.14
推奨しない古い機能は警告出すようにしてくれ
464デフォルトの名無しさん:2011/04/01(金) 23:22:14.74
互換性なんていらんだろ
別にCとしてコンパイルするわけでもあるまい
465デフォルトの名無しさん:2011/04/01(金) 23:30:14.56
じゃあDにでも行けよ
466デフォルトの名無しさん:2011/04/02(土) 00:08:08.57
ちょっと相談に乗ってください。XMLライブラリ作ってるんです。
で、文字列を返す関数がたくさんあるんですけど戻り値の型で悩んでるんです。

必ず存在するのであれば無問題。
const wstring& getValue() const { return value; }

存在するか分からない場合はどうするのがよいでしょうか?
1.参照で返す。
const wstring& getAttribute(...) const { if(...) return value; else throw exception(); }

2.無理矢理参照で返す。
const wstring& getAttribute(...) const { return ... ? value : L""; }

3.stringのポインタで返す。
wstring* getAttribute(...) const { return ... ? value : nullptr; }

4.ポインタで返す。
wchar_t* getAttribute(...) const { return ... ? value.c_str() : nullptr; }
467デフォルトの名無しさん:2011/04/02(土) 00:17:22.70
DOMの挙動に合わせるならgetAttributeは2でいいんじゃないの
468デフォルトの名無しさん:2011/04/02(土) 00:51:27.02
bool hasAttribute(...)
469デフォルトの名無しさん:2011/04/02(土) 00:57:11.77
>>466
boost::optional<wstring&>

っていうか参照返して大丈夫?
値で返さないと危ないし実装も制限されちゃうよ?
470デフォルトの名無しさん:2011/04/02(土) 01:00:42.78
その前にネーミングがキモい
| getValue
471デフォルトの名無しさん:2011/04/02(土) 01:21:24.73
Camel記法disってんのか
472デフォルトの名無しさん:2011/04/02(土) 01:38:55.15
キャメルとかどこ中出身よ?
c++erなら小文字にハイフンだろ
473デフォルトの名無しさん:2011/04/02(土) 10:19:11.75
>>467
おっしゃるとおりなのですが、return L""をやっていいものか少し不安です

>>469
メンバ変数を参照で返してはいけないみたいなことは最近よく聞く気がします
寿命による危険性は分かるのですが、ほかの理由はなんなのでしょうか?
474デフォルトの名無しさん:2011/04/02(土) 10:28:53.78
static const wstring emptywstrng = L"";
return emptywsring;
475デフォルトの名無しさん:2011/04/02(土) 11:16:57.00
wstring getValueでいいよ
476デフォルトの名無しさん:2011/04/02(土) 12:04:44.41
>>472
getValue…Haskell中
GetValue…Pascal中
get_value…C++中

異論は認める
477デフォルトの名無しさん:2011/04/02(土) 12:06:04.08
Value・・・C#
478デフォルトの名無しさん:2011/04/02(土) 12:07:50.67
Get_Value

ハイブリッド
479デフォルトの名無しさん:2011/04/02(土) 12:11:28.83
getValueはJavaのgetterのようで嫌だ
480デフォルトの名無しさん:2011/04/02(土) 12:12:56.04
小指で入力するの苦手だからgetValueの方がいいなぁ
481デフォルトの名無しさん:2011/04/02(土) 12:22:33.90
getval ... C
482デフォルトの名無しさん:2011/04/02(土) 12:48:37.06
Cも小文字にアンダースコアだろ
ただWin32APIはパスカルなんだよなw
483デフォルトの名無しさん:2011/04/02(土) 13:02:16.98
標準ライブラリにみられる strpbrk とか atoi とかいうような短縮した関数名に倣ってみました
484デフォルトの名無しさん:2011/04/02(土) 13:13:52.93
LPCTSTR lpszVal getval()

C+WINAPIの凶悪さ
485デフォルトの名無しさん:2011/04/02(土) 13:55:51.75
どこからつっこめばいいんだろう
486デフォルトの名無しさん:2011/04/02(土) 14:34:30.34
>>466
その中ならば、1.の参照or例外がいいんじゃないか? 2は危険で警告出るし、3,4はnullptrの扱いが面倒だしバグを誘発しやすいし

例外がいやならboost::optionalで返す。

boost::optional<wstring> getAttribute(...) const { if(...) return value; else boost::none; }

こんな風に呼ぶ
if(auto x=a.getAttribute(....))
func(*x); //存在したときのみfuncする。
487デフォルトの名無しさん:2011/04/02(土) 16:02:42.91
>>473
> 寿命による危険性は分かるのですが、ほかの理由はなんなのでしょうか?

469 にあるとおり、実装が制限されてしまうことが問題。

たとえば返したい文字列が既存のメンバ変数 a と b を繋げた a + b だとしても、
return a + b とはできず、 a + b を保持する ab のようなメンバ変数が必要になる、
など。
488デフォルトの名無しさん:2011/04/02(土) 17:24:33.74
そのAttrノードの下に実は複数のTextノードがあってそれらの値をくっつけて返さなきゃいけないとかだな
489デフォルトの名無しさん:2011/04/02(土) 18:40:38.12
どこかの翻訳単位にとある関数があるかどうかを調べる方法はありますか?
例えば、
void Hoge();
if(IsExitHoge())
{
Hoge();
}
のような
490デフォルトの名無しさん:2011/04/02(土) 18:56:14.72
>>489
無ければリンク時にエラーになるから、そんな方法は不要であり存在しない。
491デフォルトの名無しさん:2011/04/02(土) 19:03:06.54
>>490
まず発覚するのがリンカーなので無理ですよね
ありがとうございました
492デフォルトの名無しさん:2011/04/02(土) 20:02:13.01
要素の重複を許さない高速なコンテナっていうとmapしかないでしょうか?
挿入する要素は100程度です
493デフォルトの名無しさん:2011/04/02(土) 20:18:21.76
set は?
494デフォルトの名無しさん:2011/04/02(土) 20:18:43.01
TR1で追加されたunordered_map(ハッシュ)、あとset/unordered_set
要素数100だったらmap/setの方が早いかもね
495デフォルトの名無しさん:2011/04/02(土) 21:49:16.89
>>493
>>494
setの存在を完璧に忘れてました・・・
ありがとうございます
496デフォルトの名無しさん:2011/04/03(日) 16:33:16.16
2つの無名名前空間内で同じ名前の構造体を定義すると、重複してるって怒られる。そういう仕様ですか?

//file1.cpp
namespace { struct A{}; };

// file2.cpp
#include "file1.cpp
namespace { struct A{}; };

// ビルド VC++2010EE
error C2011: '`anonymous-namespace'::A' : 'struct' 型の再定義

でも、名前空間をBとCに分けると、当然ながらOKに。なんか納得出来ないんだけど。
497デフォルトの名無しさん:2011/04/03(日) 16:44:04.07
>>496
.cpp をインクルードするな。

無名名前空間はコンパイル単位ごとにユニークなもの。ファイルごとじゃない。
498デフォルトの名無しさん:2011/04/03(日) 16:45:15.19
>>496
そういう仕様です。
499デフォルトの名無しさん:2011/04/03(日) 16:56:29.29
無名名前空間って、他のファイルからは見えない〜って説明が多いし
そうだと思ってたけど、本当は翻訳単位なのね。
勉強になりました、どうもセックスコ
500デフォルトの名無しさん:2011/04/03(日) 18:13:55.86
他のファイルからは見えないと思っていたのにインクルードしたんだね
501デフォルトの名無しさん:2011/04/03(日) 20:14:38.67
>>500
includeしたヘッダに無名名前空間しか無いとでも?
想像力が乏しい人だな
502デフォルトの名無しさん:2011/04/03(日) 23:12:59.31
>>496
君はプログラミングに向いてない
503デフォルトの名無しさん:2011/04/04(月) 00:29:57.39
これが C++ スレか...
504デフォルトの名無しさん:2011/04/04(月) 00:57:34.29
namespaceはC++じゃないか。「他のファイルから見えない」という
間違った説明を読んで ↓ ができると思ったんだろ。
file1.cpp: namespace {int x;} int &f1(){return x;}
file2.cpp: #include "file1.cpp" namespace {int x;} int &f2(){return x;}

残念ながらC++は未だにCのプリプロセッサの糞仕様を引きずった言語
505デフォルトの名無しさん:2011/04/04(月) 02:57:43.83
便乗で
無名の名前空間ってなんのためにあるんですか?
506デフォルトの名無しさん:2011/04/04(月) 03:02:43.62
>>502
匿名名前空間なんだから個々は干渉し合わないと考えるのが普通なわけだがw
507デフォルトの名無しさん:2011/04/04(月) 03:34:37.75
static とどう違うのっていう意味かな
static だと内部結合だけど無名名前空間だと外部結合になるよ
508デフォルトの名無しさん:2011/04/04(月) 07:29:04.26
意味のわからん説明するな。
内部リンケージと、絶対他から参照されない外部リンケージの
何が機能的に違うのかを説明してくれたまへ
509デフォルトの名無しさん:2011/04/04(月) 08:14:27.98
お前ら規格ぐらい参照しろや
510デフォルトの名無しさん:2011/04/04(月) 08:44:43.47
そのstaticはC++ではdeprecatedだから使うんじゃねえ!
素直に無名名前空間使え!

と規格には書いてある
理由はいろいろあるけど気にするな
511デフォルトの名無しさん:2011/04/04(月) 11:13:31.05
ファイルローカルな型を宣言するのに static は使えないから、無名名前空間が必要。
512デフォルトの名無しさん:2011/04/04(月) 11:59:18.96
void test( char (&a)[ 8 ] )
{}
の&ってどういう意味ですか?
513デフォルトの名無しさん:2011/04/04(月) 12:03:48.68
>>512 参照
514デフォルトの名無しさん:2011/04/04(月) 12:17:27.71
>>512
char[8] の参照。
515デフォルトの名無しさん:2011/04/04(月) 12:19:30.06
void test( char a[ 8 ] )
{}
とどう意味が違うんですか?
516デフォルトの名無しさん:2011/04/04(月) 12:19:53.11
参照渡しは覚えるといろいろ捗るぞ
517デフォルトの名無しさん:2011/04/04(月) 12:26:25.40
ふつうは、char *aだろ。
518デフォルトの名無しさん:2011/04/04(月) 12:32:34.84
>>515
ポインタと参照の利点欠点の話じゃね?

個人的には参照で任意の長さの配列を取るテンプレート関数書けるから色々重宝してるな。
template<class T,int N>
void DoSomething(T (&Ary)[N]){
//DODODO
}

ちょっと踏み込めば行列演算もかけるよ。効率は書き方しだいだけど。
519デフォルトの名無しさん:2011/04/04(月) 12:35:27.90
>>517
ふつうだけじゃ色々不都合があるんだよ。

>>515
引き数限定で、
char a // char
char & a // charの参照(通常使わない)
char * a // charへのポインタ
char a[8] // char *aと解釈される
char (& a)[8] // char[8]の参照
char (* a)[8] // char[8]へのポインタ
となる。
520デフォルトの名無しさん:2011/04/04(月) 12:58:54.30
>>519
引数限定なのは↓だけでしょ。
> char a[8] // char *aと解釈される
521デフォルトの名無しさん:2011/04/04(月) 13:04:08.06
すみません。
PHPの関数をCに移植してLIBを作りたいのですが。
どうやるといいですか? 
PHPがバージョンアップしても移植部分のコードは変更なしがいいのですが。


PHPソースコードのある所
http://www.php.net/downloads.php
522デフォルトの名無しさん:2011/04/04(月) 13:06:36.83
C++関係ないな。
523デフォルトの名無しさん:2011/04/04(月) 13:38:06.69
>>521
コードが公開されてるなら、それを移植。
コードが公開されて無いなら、想像して実装。
スクリプト上での便利機能を移植したいなら、結局関連する機能全部移植。

Cの上でやる以上、Cの文法からは逃げられないし、PHPライクにしたいならプリプロセッサ地獄におちるだろう。
524デフォルトの名無しさん:2011/04/04(月) 16:18:11.35
>>515
sizeof a
525デフォルトの名無しさん:2011/04/04(月) 19:32:23.84
>>501
includeしたヘッダの無名名前空間のみが見えなくなると思ったのか。おめでたいな。
526デフォルトの名無しさん:2011/04/04(月) 19:37:40.03
変更することのない引数って、const参照にすることが多いと思うんだけど、
int とか charとかもしてる?
それとも、集成型以上に限定してる?
527デフォルトの名無しさん:2011/04/04(月) 19:49:42.68
const参照は変数がなくても渡せる利点がある。参照では無理だが。
528526:2011/04/04(月) 20:05:41.17
あ、constをつけるつけないではなくて、参照にするかどうかです。
529デフォルトの名無しさん:2011/04/04(月) 20:16:50.24
クラスか否かだけだなー
530デフォルトの名無しさん:2011/04/04(月) 20:25:34.20
intとかcharはコンパイラの最適化かかるから参照にしても速度的には意味ない
531デフォルトの名無しさん:2011/04/04(月) 20:32:59.58
アドレスのコピーは4バイト位だから、概ねintと同じだし、プリミティブ型は理由が無ければ普通に宣言する。
かなー。
532デフォルトの名無しさん:2011/04/04(月) 20:33:55.59
intとかcharは、参照やポインタ使うと速度的には少しだけ損だろ。
533デフォルトの名無しさん:2011/04/04(月) 20:50:50.85
アドレスが4バイトって、お前、何世紀に生きてるんだよ
534デフォルトの名無しさん:2011/04/04(月) 20:53:09.80
いつも威勢のいい兄さんでも 524 にはつっこめないのか・・・わかります
535デフォルトの名無しさん:2011/04/04(月) 21:06:43.80
>>533
ふっふっふ、そこには抜け穴があって"位"って書いてあるじゃん。
別に8バイトでもいいのよ。概ねsizeof(int)位ってことで・・・。
536デフォルトの名無しさん:2011/04/04(月) 21:09:33.81
すみません、ここで聞くことかどうか分かりませんが、
C/C++で「無線LANスポット」を一覧取得出来るようなネットワークプログラミング向けのライブラリ等ありませんでしょうか。
537デフォルトの名無しさん:2011/04/04(月) 21:12:47.78
>>535
アホか
アドレスのサイズはsizeof(void*)
538デフォルトの名無しさん:2011/04/04(月) 21:13:29.30
>>536
OS依存
スレ違い
539526:2011/04/04(月) 21:15:49.19
どもでした。やっぱ何でも参照にするのはいまいちですよね。
たまに統一感があるからという理由でinはどの型でもconst参照、outはポインタにって現場があるので聞いてみました。
540デフォルトの名無しさん:2011/04/04(月) 21:16:00.63
すみません、ここで聞くことかどうか分かりませんが、
C/C++で「Gスポット」の場所を取得出来るようなライブラリ等ありませんでしょうか。
541536:2011/04/04(月) 21:19:18.03
>>538
ご回答どうもありがとうございます。
探してまいります。
542デフォルトの名無しさん:2011/04/04(月) 21:33:45.52
>>538
いや、OSの仕事でもないよそれ・・・。
543デフォルトの名無しさん:2011/04/04(月) 22:13:48.56
質問です
今DXライブラリの通信を利用してクラスを送り、受信側の同じクラスにコピーして、メンバーを表示するというプログラムを書いているのです。
現在コピーするクラスは
int a[9]が5つ std::string a[9][30]が1つ クラスのメンバーを持っています
これを以下のように受け取っているのですが

Class Class_copy
Class *test;
test=new Class;
NetWorkRecv( NetHandle , Chara_test , DataLength ) ; // データをバッファに取得
Class_copy=*test;

これを実行したときにstd::string a[9]が8文字以上のひらがな・漢字・全角カナを受け取ると表示したときに凄く文字化けしてしまうのです
他のint型メンバーや7文字以下のstringは何も問題がないのですが・・・
一体何が原因なのでしょうか
544デフォルトの名無しさん:2011/04/04(月) 22:30:12.67
コピーコンストラタクタ書けよ
545デフォルトの名無しさん:2011/04/04(月) 22:34:58.75
スイマセンコピーコンストラクタはデフォルトを使っています
546デフォルトの名無しさん:2011/04/04(月) 22:36:52.54
string a[9]なのかstring a[9][30]なのかはっきりしろ
547デフォルトの名無しさん:2011/04/04(月) 22:41:28.09
そのNetWorkRecvとやらは、コピーコンストラクタを呼んでデータをコピーしているのか?
std::stringをビットごとにコピーしても動かないぞ
548536:2011/04/04(月) 22:48:22.74
>>542
あ、そうなんですか・・・?
WDKというデバイス開発用キットを落として入れてみたりはしたんですが、
ネットワークプログラミング自体に接するのが初めてでして、そういったライブラリが既にどこかに存在するのかと推察しておりました。
よろしければご教授頂けませんか?
549デフォルトの名無しさん:2011/04/04(月) 22:50:36.78
>>546
ちょっと書き方が悪かったです。string[9][30]のstring[1][30]~[9][30]に受け取った文字です
動作としてはこんな感じです
a[0][30]="ああああ" 普通に表示
a[1][30]="ああああああああ" 表示すると文字化け

>>547
NetWorkRecv(int NetHandle, void *Buffer, int Length)は NetHandle の指し示す接続先からDataLength分データをバイト単位でBufferの示すアドレスにコピーする、とのことです
std::stringはビットごとにコピーしても動かないのですか?7文字以下だとちゃんと表示されるのですが・・・
550デフォルトの名無しさん:2011/04/04(月) 22:51:07.79
もしかしてこいつchar[]と一緒だと思ってないか
551デフォルトの名無しさん:2011/04/04(月) 22:57:25.09
シリアライズとかしたほうがいいんじゃないか
そのまま突っ込むのはさすがに無理がありすぎるだろ
552デフォルトの名無しさん:2011/04/04(月) 22:57:46.14
とりあえず言語の勉強のほうが先だと思う
553デフォルトの名無しさん:2011/04/04(月) 23:07:01.54
>>550
便利なcharぐらいの印象です。

>>551
シリアライズですか。ちょっと調べてみよう・・・
554デフォルトの名無しさん:2011/04/04(月) 23:11:08.30
>>553
charは文字で、stringは文字列だぞ
言わば、string == char[]
555デフォルトの名無しさん:2011/04/04(月) 23:12:37.99
>>554
いくらなんでもそこは等号じゃないだろう。
556デフォルトの名無しさん:2011/04/04(月) 23:13:02.43
>>553
せっかくだから Plain Old Data についても調べておくといいかもしれない
557デフォルトの名無しさん:2011/04/04(月) 23:16:30.44
ヒープを使わない文字列クラス教えてください。
558デフォルトの名無しさん:2011/04/04(月) 23:16:47.28
>>555
≒とか付けるの面倒だったんだ察してくれw
559デフォルトの名無しさん:2011/04/04(月) 23:34:08.45
>>537
よく考えればそうかも。改宗します。
560デフォルトの名無しさん:2011/04/04(月) 23:58:24.67
stringは実装的にはポインタや付加情報を保持する形になっているんだから、
そのまま送ってデータが届くわけがないだろう。
どんなテレパシーなんだよ。
561デフォルトの名無しさん:2011/04/05(火) 02:02:52.14
俺とお前はテレパステレパスだというのに
562のみねーと ◆myadMFZ/7k :2011/04/05(火) 08:25:45.87
          r、 |:.:.:.:.〈;;;;;;;ノ               :.:.:.:.ヽ
          _/△ハ,,__ / ハ !:.:.:.:.:.:.::.:.:.:.:.:.:...        :.:.:.:.ヘ
      /: : : : : :/ ||:.:i/'ーリ―- 、_:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.   :.:.:.:.:.:.ハ
     //: : /: :.:.ト=': : : : :/: : : : : : :. ̄`''ー- 、:.:.:.:.:.:.:.:.:... . .:.:.:.:.:.:!
    / /: : /:.:.:.:.:/: :./: : : /: : : :./: : :/:/: /!: :.i::::``.、:.:.:.:.:.:.:.:.:.:.:.:.:.:!
.      /: :./:.:.:.:.:.:! : /: : : / : : : /: : :/:/!:./ |:.:.l|: : :.:.::::\:.:.:.:.:.:.:.:.:.:.|
    /Vlハ|/!/!|: : !: : : :! : : :.,'!: :.:/:/ |,'  |: :|!: :! : i:.:.::::ヽ.:.:.:.:.:.:.:.:l
         ,イ  /|: :.|: : : :|: : : :.!|: :/:/ |!  .|:.リ|: :|:.:.:|: : : : :ハ:.:.:.:.:.:.!
.       /  / ! ,r|: : : :|: :.'"丁/ ̄` |!   !,'十ァ!、:.|: : : :.|: !:`! _,/
          |:.! |: : : :| ,rfj ̄ヾ、   !   / |ム」_:リ!: : :.,':.:|:::「
          | ト.|: : : :K {| ::::::リ   l  / ,イ}:::::::ハ,!: :.:/:.:.,'::::|
              V:.ハ: : :.|  ゛ー ''        K.__,/ }:.:.:/:.::/::::リ
             V: |: : :ト . xxxx     ,.   `"''" //}:::/: :.,'   ただちに逃げてください...
              V:ハ : |:::\   __     "'''''' /イ:::::/: :./    
            リハハヽ-t`/  \   _,. イ//l/!/|/!      
    ,..、           / /~\ ヽ‐、  /  / / リ 
   /: : :\   _  __,.ィ| イ ,.へ `< ヽr‐ァ―=‐、      
  くr! : : : : : }フ´ \ ̄ハ:.:.:.:ハ  イ ,、〆``ー /:.:/::/   ハ
.  |ト、: : : : :/     ヘ::|: !.:.:.:ハ   ∨ ̄  / .:/::/ /   i!


ただちににげろのガイドライン
http://www.geocities.jp/ust7800870/index.html

ドイツ4月7日予想
ttp://www.geocities.jp/ust7800870/img/2011_04_07.jpg
http://www.dwd.de/
563デフォルトの名無しさん:2011/04/05(火) 19:53:59.15
西日本も福島原発の放射能に曝される。

4/7 予測 http://up3.viploader.net/ippan/src/vlippan198234.jpg
発表はドイツ気象庁 http://www.dwd.de/
564デフォルトの名無しさん:2011/04/05(火) 23:08:18.22
ダウンキャストするのとunion使うのどっちがいいですか?
565デフォルトの名無しさん:2011/04/05(火) 23:17:20.68
まずは評価基準を明確に示せ。
566デフォルトの名無しさん:2011/04/06(水) 02:09:05.84
>>564
ダウンキャストとunionで同じ事をするソース見せて。
567デフォルトの名無しさん:2011/04/06(水) 22:12:30.96
>>564
unionと同じようなことをさせるキャストはダウンキャストは呼ばないんじゃないか?
568デフォルトの名無しさん:2011/04/07(木) 03:35:56.79
>>566
引数でバリアント型を含むクラスを使うか目的のクラスにキャストして使うか迷っていました
>>567
たしかにそうですね、、、失礼しました
569デフォルトの名無しさん:2011/04/07(木) 16:23:40.36
struct Boo{
  int a,b,c;
  char* p;
};
Boo boo = {};
・・・
boo = Boo(); //これ

構造体をこのようにクリアするのはまずいですか?
他にいい方法ありますか?
570デフォルトの名無しさん:2011/04/07(木) 16:35:54.52
コンストラクタ書けばいいよ
571デフォルトの名無しさん:2011/04/07(木) 17:45:46.17
PODにしたいです
572デフォルトの名無しさん:2011/04/07(木) 18:16:18.75
memcpyでいいよ
573デフォルトの名無しさん:2011/04/07(木) 18:59:13.03
PODなら別にいいじゃん
574デフォルトの名無しさん:2011/04/07(木) 19:12:00.41
なにをきにしているんだ
575デフォルトの名無しさん:2011/04/07(木) 19:13:32.37
個人的にはVTABLEもってないならMemset大丈夫だとおもうんだけど、どうかな??
576デフォルトの名無しさん:2011/04/07(木) 20:26:25.13
memsetするのはC厨か老害
577デフォルトの名無しさん:2011/04/07(木) 20:40:34.18
>>569
Boo boo={0,0,0,""};
でいんじゃね?
578デフォルトの名無しさん:2011/04/07(木) 20:46:03.70
Boo boo={0};でいい
579デフォルトの名無しさん:2011/04/07(木) 20:50:22.15
使った後に値をクリアする話だろ
PODならmemsetで問題なし
580デフォルトの名無しさん:2011/04/07(木) 21:01:35.93
>>578
あいたたたたた
581デフォルトの名無しさん:2011/04/07(木) 21:06:51.15
あんまりいい方法じゃないけど、

Boo ForClear ={0};
Boo Using;

//dododo

Using = ForClear;

とか・・・。
582 [―{}@{}@{}-] デフォルトの名無しさん:2011/04/07(木) 21:14:52.00
callocした後に何回でもmemsetで初期化してやる
583デフォルトの名無しさん:2011/04/07(木) 21:25:09.86
>>581
ForClearはstatic constにしておけば最適化で即値代入になってくれるんじゃね。
584デフォルトの名無しさん:2011/04/07(木) 21:51:05.66
>>583
横からだけど、それいいね。
一回初期化されればあとはメモリのコピーコストくらいか。スタックもそんなに食わないし。
バッドノウハウには違いないが、悪くないかも??
585デフォルトの名無しさん:2011/04/07(木) 22:07:14.33
ほんといいね。思いつかなかった
memsetはどんなにコンパイラが最適化しようと
ループを使わざるを得ないから効率が悪い。
実行途中の初期化はそれ使うことにする。
586デフォルトの名無しさん:2011/04/08(金) 01:00:04.24
>>575,579
ポインタや浮動小数点数は memset() で 0 埋めしても 0 になるとは限らないぞ。
587デフォルトの名無しさん:2011/04/08(金) 01:04:19.19
>>585
ダウト〜
バウンダリでサイクル合わせたりアンロールもできる
アセンブラ覗いてみればわかること
588デフォルトの名無しさん:2011/04/08(金) 01:06:26.76
>>568
引数でバリアント型を含むクラスを使うのと目的のクラスにキャストして使うのとで同じことするソース見せて。
589デフォルトの名無しさん:2011/04/08(金) 03:14:21.23
BOOST_PP_IIF(BOOST_PP_EQUAL(n, i), HOGE, FUGA) とすると、 BOOST_PP_EQUAL(n, i) が展開されずに
BOOST_PP_IIF_BOOST_PP_EQUALと結合されてしまうんですがどうにかしてBOOST_PP_EQUALは使えないんでしょうか。
590デフォルトの名無しさん:2011/04/08(金) 03:42:49.90
BOOST_PP_EQUALに数字以外を入れるな
次からはboostスレできこうね
591デフォルトの名無しさん:2011/04/08(金) 05:02:59.28
>>580
なんであいたたなの?
592591:2011/04/08(金) 05:04:10.15
ああ、ごめん。ちゃんと見てなかったわ。
無理ね。
593デフォルトの名無しさん:2011/04/08(金) 10:55:37.25
これはどこが間違えかわかりますか? 
テキストファイルを読み込んで、行へ分割して、出力しているのですが。
まれに、x行目(x+1)行目と改行なしで続けて出力されます。


#include <string>
using namespace std;
#define CashSize (1<<18)

int main() {
char *fn = "sample.txt";
FILE *fp = fopen( fn , "rb" );
FILE *fq = fopen( "outfile.txt" , "wb" );
string Cash;
unsigned int m, n;
while ( !feof(fp) ) {
m = Cash.size(); Cash.resize( m + CashSize );
n = fread( &Cash[m], 1, CashSize, fp);
Cash.resize( m + n );
m = 0;
while(1) {
for( n=m; n<Cash.size(); n++ ) if(Cash[n]=='\n' || Cash[n]=='\r') break;
if( n >= Cash.size() ) break;
if(m<n) { string t = Cash.substr(m,n-m)+"\n"; fwrite( &t[0], 1, t.size(), fq); }
m=n+1; }
Cash = Cash.substr(m); }
fwrite( &Cash[0], 1, Cash.size(), fq);
fclose(fp); fclose(fq); }
594デフォルトの名無しさん:2011/04/08(金) 10:58:48.48
C/C++の行読み込み関数を使うと遅いので、バッファへまとめて読み込んで処理したいんです。
595デフォルトの名無しさん:2011/04/08(金) 11:12:40.43
>>593-594
ぱっと見ではよくわからんが、その程度の処理でよくわからんコードになってる
というのがまず間違いだろうな。

「長いソースを貼るときは」 >>5
変数名をちゃんとつけて、使い回しをやめろ。
エラーチェック抜けてる。
× cash ○ cache そもそも >>594 を見ると「キャッシュ」じゃなくて「バッファ」でしょ。
#include <cstdio> 抜けてる。
CashSize は unsigned int const で。

それ以前に、何を見て「遅いので」と言ってるのかがまず怪しい気がしてきた。
596デフォルトの名無しさん:2011/04/08(金) 11:38:56.16
書き直しました。

#include <stdio.h>
#include <string.h>
#define BuffSize (1<<10)

int main() {
FILE *fp = fopen( "sample.txt" , "rb" );
FILE *fq = fopen( "outfile.txt" , "wb" );
char buff[BuffSize+1]; int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buff[readiti], 1, BuffSize-readiti, fp);
char *p=&buff[0], *q, *endp=&buff[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break;
if(q==endp) break;
if(q!=p) { fwrite( p, 1, q-p, fq); fwrite( "\n", 1, 1, fq); }
p=q+1; }
readiti=(int)(endp-p);
memmove(buff, p, readiti); }
fwrite( buff, 1, readiti, fq);
fclose(fp); fclose(fq); }
597 忍法帖【Lv=9,xxxP】 :2011/04/08(金) 12:04:56.18
×間違え
◯間違い

それはさて、先ずは非バッファ版を作って正常に動作させ、速度の検証をするべきだな。
その程度のコードだと、一行ずつ処理しても殆ど遅くならないと思う。
598デフォルトの名無しさん:2011/04/08(金) 12:35:56.14
非バッファ版っていうと、こんなもんでいいんじゃない?(動かしてないけど)

#include <fstream>
#include <cstdlib>
int main()
{
  std::ifstream input("sample.txt");
  std::ofstream output("outfile.txt", std::ios::binary);
  output << input.rdbuf();
  output.close();
  return (input.good() && output.good()) ? EXIT_SUCCESS : EXIT_FAILURE;
}
599デフォルトの名無しさん:2011/04/08(金) 12:37:04.85
あ、 input.close() 抜けてた。まぁいいか。
600デフォルトの名無しさん:2011/04/08(金) 12:42:59.24
なるべく高速に行分解をしたいということなんです。
601デフォルトの名無しさん:2011/04/08(金) 12:45:41.66
高速化の必要性うんぬんは質問に関係ないだろ
602デフォルトの名無しさん:2011/04/08(金) 12:57:02.12
>>600
高速性云々はさておき
入力ファイルは「行で区切られている」からファイルを「そのままコピー」するコードを書けばいいはずだが書かれたコードはそうなっていない

それ以外の要件があるんじゃないのか?
603デフォルトの名無しさん:2011/04/08(金) 12:57:43.24
>>600
これで速度に不満があるのか?

#include <iostream>
#include <fstream>
#include <cstdlib>
int main()
{
  std::ifstream input("sample.txt");
  std::string line;
  while(std::getline(input, line))
    std::cout << line << std::endl;
  return input.good() ? EXIT_SUCCESS : EXIT_FAILURE;
}
604デフォルトの名無しさん:2011/04/08(金) 12:57:58.86
二倍は速い。独自のほうが。

#include <iostream>
#include <string>
#include <vector>
#include <time.h>
#define bufSize (1<<20)
using namespace std;

char *buf;
void vecset1(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0);
while ( !feof(fp) ) { fgets(buf,bufSize,fp); vec.push_back(string(buf,strlen(buf))); }
fclose(fp); }

void vecset2(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0);
int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break; if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) );  p=q+1; }
readiti=(int)(endp-p); memmove(buf, p, readiti); }
vec.push_back( string(buf,readiti) );
fclose(fp); }

int main() {
buf=new char[bufSize]; char *fn="D:/desktop/行をシャッフル/sample.txt"; vector<string> vec; int cl;
cl=clock(); vecset1( fn, vec ); cout<<(clock()-cl)<<endl;
cl=clock(); vecset2( fn, vec ); cout<<(clock()-cl)<<endl; }
605デフォルトの名無しさん:2011/04/08(金) 13:01:56.96
Cならsetvbuf()
C++ならstreambuf::pubsetbuf()使ってみたら
606デフォルトの名無しさん:2011/04/08(金) 13:08:20.51
C++はもっと遅かった。C++8157clock、バッファから分割3609clock。

#include <fstream>
#include <time.h>
#define bufSize (1<<20)
using namespace std;
char *buf;

void vecset1(char *fn, vector<string> &vec) {
fstream fp(fn); string line; vec.resize(0);
while(getline(fp, line)) vec.push_back(line);
fp.close(); }

void vecset2(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0);
int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break; if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) );
p=q+1; }
readiti=(int)(endp-p); memmove(buf, p, readiti); }
vec.push_back( string(buf,readiti) );
fclose(fp); }

int main() {
buf=new char[bufSize]; char *fn="sample.txt"; vector<string> vec; int cl;
cl=clock(); vecset2( fn, vec ); cout<<(clock()-cl)<<endl;
cl=clock(); vecset1( fn, vec ); cout<<(clock()-cl)<<endl; }
607デフォルトの名無しさん:2011/04/08(金) 13:09:12.91
>>606は、先頭にこれが抜けてた。

#include <iostream>
#include <string>
#include <vector>
608 忍法帖【Lv=9,xxxP】 :2011/04/08(金) 13:10:55.86
入力の所要時間だけ比べて二倍速い(キリッ とか言われてもなぁ。
そもそも、その比較じゃディスクキャッシュも効いちゃうのだけどね。
609デフォルトの名無しさん:2011/04/08(金) 13:12:41.14
>>608
そのために、>>606はC++の行読み込みを、後にしたよ。それでも遅い。
610デフォルトの名無しさん:2011/04/08(金) 13:15:41.55
それでvecset2の行分割は、
どこが間違えているのかわからないっていう質問なんですが。
およそテキスト10Mで2カ所ほど、改行が無くなって一つの行になにってしまいます。
611606:2011/04/08(金) 13:28:33.22
ディスクキャッシュと、vectorのメモリ確保で差が出てしまうから、
繰り返し速度を測ったけど、標準は圧倒的に遅い。

int main() {
buf=new char[bufSize];
char *fn="sample.txt";
vector<string> vec;
for(int n=1; n<20; n++ ) {
int a,b,x;
x=clock(); vecset1( fn, vec ); a=clock()-x;
x=clock(); vecset2( fn, vec ); b=clock()-x;
cout<<n<<"回目: C++行読み込み "<<a/CLOCKS_PER_SEC<<"sec. 独自 "<<b/CLOCKS_PER_SEC<<"sec.\n";
}}
612デフォルトの名無しさん:2011/04/08(金) 13:33:35.44
>>606
手元の Cygwin g++ 4.3.4 の -O3 で 10MB ぐらいのテキスト読ませてみたら、
fstream+getline() がだいたい 1.5 倍ぐらい時間かかってた。
順番入れ替えたり何度か繰り返してみたけど、それぐらいで落ち着く。
613デフォルトの名無しさん:2011/04/08(金) 13:34:56.28
>>606
vecset1() と vecset2() の結果を入れる vec を2つにわけて比較してやれば
どこで間違ってるかわかるんじゃないの?
614デフォルトの名無しさん:2011/04/08(金) 13:37:34.31
>>605
バッファサイズと関係なく遅かったC++行読み込み。
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <time.h>
#define bufSize (1<<20)
using namespace std;
char *buf;

void vecset1(char *fn, vector<string> &vec) {
fstream fp(fn); fp.rdbuf() -> pubsetbuf(buf, bufSize); string line; vec.resize(0);
while(getline(fp, line)) vec.push_back(line); fp.close(); }

void vecset2(char *fn, vector<string> &vec) {
FILE *fp = fopen( fn , "rb" ); vec.resize(0); int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break; if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) ); p=q+1; }
readiti=(int)(endp-p); memmove(buf, p, readiti); }
vec.push_back( string(buf,readiti) ); fclose(fp); }

int main() {
buf=new char[bufSize]; char *fn="sample.txt"; vector<string> vec; int n,a,b,x;
for(n=1; n<20; n++ ) {
x=clock(); vecset1( fn, vec ); a=clock()-x;
x=clock(); vecset2( fn, vec ); b=clock()-x;
cout<<n<<"回目: C++行読み込み "<<a/CLOCKS_PER_SEC<<"sec. 独自 "<<b/CLOCKS_PER_SEC<<"sec.\n";}}
615デフォルトの名無しさん:2011/04/08(金) 13:43:10.45
>>613
どこが間違えるか比べるのは既にやったのですが。原因がわからないです。ほぼ一致します。
5メガ程度だと完全一致する事もあって10メガだと2個程度、間違えたりします。
616デフォルトの名無しさん:2011/04/08(金) 13:56:08.04
>>613
サンクス。いつもはボーランドだけど、VC2008で最適化したら1.657倍だった。
617デフォルトの名無しさん:2011/04/08(金) 13:58:03.47
>>610
ざっと見た感じ そのコードはバッファの先頭に改行がきたら出力されないでしょうね
テキストの先頭に改行がある場合と、バッファリングで改行がバッファ先頭にきたら改行無視される
618614, 610:2011/04/08(金) 14:05:26.06
vecset2は、改行のみの行はスルーする仕様なんですが。それは別ですか。
619 忍法帖【Lv=9,xxxP】 :2011/04/08(金) 14:05:43.60
cygwinはラッパが遅い。
それはさて、>606は空行を飛ばしてしまうし、末尾一行余計に追加している。
620デフォルトの名無しさん:2011/04/08(金) 14:06:43.20
仕様かよw
621610、614:2011/04/08(金) 14:13:21.54
改行は正確に扱うと、手間がかかるので、空行はスルーしました。目標のためには空行は無視してかまわないので。
622デフォルトの名無しさん:2011/04/08(金) 14:17:18.61
>>619
ここですか?
元テキストが改行で終わっていない場合、未出力部分が残ってしまうと思うのですが。

> vec.push_back( string(buf,readiti) ); fclose(fp);
623デフォルトの名無しさん:2011/04/08(金) 14:24:17.95
いや、途中の空行は無視して、末尾に空行を追加すると言う仕様でいいならいいんじゃない?
個人的には有り得ないけど。
624デフォルトの名無しさん:2011/04/08(金) 14:26:54.30
>>623
おまけに、偶然バッファの先頭に改行が来たらそいつも無視する仕様ってことで一つw
625デフォルトの名無しさん:2011/04/08(金) 14:39:32.75
>>623
これでいいですか。
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <time.h>
using namespace std;
#define bufSize (1<<20)
char *buf;
void vecset(char *fn, vector<string> &vec) {
vec.resize(0);
FILE *fp = fopen( fn , "rb" );
int readiti=0, enditi;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break;
if(q==endp) break;
if(q!=p) vec.push_back( string(p,q-p) );
p=q+1; }
readiti=(int)(endp-p); if(readiti) memmove(buf, p, readiti); }
if(readiti) vec.push_back( string(buf,readiti) ); fclose(fp); }

int main() {
buf=new char[bufSize]; char *fn="sample.txt";
vector<string> vec;
//速度測定
double x=clock(); vecset( fn, vec ); cout<<(clock()-x)/CLOCKS_PER_SEC<<"sec.\n";
//出力
fstream fp("outfile.txt", ios::out ); for( int n=0; n<vec.size(); n++ ) fp<<vec[n]<<endl; fp.close(); }
626デフォルトの名無しさん:2011/04/08(金) 14:42:25.92
バッファサイズを超えた長さの行が入力されたら出力されない部分がでてくる?
627610、614:2011/04/08(金) 14:45:51.10
ありがとうございました。解決したと思います。
>>625のコードで75MBのテキストで成功しました。
628デフォルトの名無しさん:2011/04/08(金) 14:59:22.47
>627
バッファを越える長さの行があると破綻するね。
629610、614:2011/04/08(金) 15:20:09.95
>>628
いま修正中です
630610、614:2011/04/08(金) 15:39:39.21
できましたよ。これで正常動作するはず。
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <time.h>
using namespace std;
#define bufSize (1<<6)
char *buf;
void vecset(char *fn, vector<string> &vec) {
vec.resize(0);
FILE *fp = fopen( fn , "rb" );
int readiti=0, enditi; string bigstr;
while ( !feof(fp) ) {
enditi = readiti + fread( &buf[readiti], 1, bufSize-readiti, fp);
char *p=&buf[0], *q, *endp=&buf[enditi];
while(1) {
for( q=p; q!=endp; q++ ) if(*q=='\n' || *q=='\r') break;
if(q==endp) break;
if(q!=p || bigstr.size()>0 ) { vec.push_back( bigstr + string(p,q-p) ); bigstr.resize(0); }
p=q+1; }
readiti=(int)(endp-p); if( readiti==0 ) continue;
if(p!=&buf[0]) { memmove(buf, p, readiti); continue; }
bigstr += string(p, readiti); readiti=0;
}
if( readiti>0 || bigstr.size()>0 ) vec.push_back( bigstr + string(buf,readiti) );
fclose(fp); }

int main() {
buf=new char[bufSize]; char *fn="sample.txt"; vector<string> vec;
double x=clock(); vecset( fn, vec ); cout<<(clock()-x)/CLOCKS_PER_SEC<<"sec.\n";
fstream fp("outfile.txt", ios::out ); for( int n=0; n<vec.size(); n++ ) fp<<vec[n]<<endl; fp.close(); }
631デフォルトの名無しさん:2011/04/08(金) 15:45:45.83
おつ
632610、614:2011/04/08(金) 16:53:22.11
行のシャッフルとソートを作って、これらを超えようと開発はじめたんですが。
対象が100ギガほどなら、入出力とメモリ管理が決定的に重要なはず。



Mersenne Twister でランダムに行をシャッフル (2) - ny23の日記(シャッフル)
http://d.hatena.ne.jp/ny23/20100803/p1

そ〜太 2nd(ソート)
http://www.vector.co.jp/soft/win95/util/se127691.html
633デフォルトの名無しさん:2011/04/08(金) 20:41:13.77
そんな入力ロジックで大丈夫か?
634デフォルトの名無しさん:2011/04/08(金) 23:11:57.55
ていうか、f***を使ってる時点でバッファリングされてるんだから
そんな神経質になる必要あるんかな。
635デフォルトの名無しさん:2011/04/08(金) 23:22:30.51
最もコードが簡略になるように作り、速度を測ったのちに改変するのが良い。
636デフォルトの名無しさん:2011/04/09(土) 16:28:41.83
bitsetのように、[]で代入と参照するにはどうしたらいいですか。

#include <iostream>
#include <bitset>
using namespace std;

int main() {
bitset<100> a;
a[1]=3;
cout<<a[1]<<endl;
}
637デフォルトの名無しさん:2011/04/09(土) 16:34:05.63
何を[]で代入と参照させるんだ?vector?
638デフォルトの名無しさん:2011/04/09(土) 16:46:04.38
すみません。一番最後の行の実装方法がわからないです。

#include <iostream>
using namespace std;


class bitset_mini {
int x;
public:
bool operator [] ( unsigned int n ) { return (x>>n)&1 ; }
};


int main() {
bitset_mini z;
cout<< z[1] <<endl;
z[1]=3; //これの動かし方がわからない。
}
639デフォルトの名無しさん:2011/04/09(土) 16:48:34.56
>>638
C++では無理。
C#のプロパティならできる。
640デフォルトの名無しさん:2011/04/09(土) 16:52:33.15
bitsetでは出来てるのですが?
641デフォルトの名無しさん:2011/04/09(土) 16:53:47.28
boolを返すんじゃなくてproxyはさめ
642デフォルトの名無しさん:2011/04/09(土) 17:07:04.18
くわしく
643デフォルトの名無しさん:2011/04/09(土) 17:08:32.57
>>641
自力でやってみます
644デフォルトの名無しさん:2011/04/09(土) 17:47:04.63
無理矢理出来た。これが正解なのだろうか?

#include <iostream>
using namespace std;

template <class cls> class one_bit {
cls *x; unsigned int k;
public:
one_bit( cls *y , unsigned int n ){ x = y; k=n; }
void operator = ( int n ) { *x |= (n&1)<<k ; } //代入
operator cls() { return ((*x)>>k)&1; } //表示
};

class bitset_mini {
int x;
public:
one_bit<int> operator [] (unsigned int n) { return one_bit<int>(&x, n); }
};


int main() {
bitset_mini z;
cout<< z[1] <<endl;
z[1]=3;
cout<< z[1] <<endl;
}
645デフォルトの名無しさん:2011/04/09(土) 17:50:04.32
templateいらないか
646デフォルトの名無しさん:2011/04/11(月) 05:48:41.40
例外安全のためにと例外を送出しないようにするコードをよく見ます
void hoge() throw() {}

これにはどういう意味があるのでしょうか?
- 例外が発生するくらいなら強制終了させる
- ただ例外が発生し得ないことを明示しているだけ
- その他
647デフォルトの名無しさん:2011/04/11(月) 06:53:13.80
>>646
意味については自分で答えが出てるみたいだけど、ほんとは何が聞きたいの?
648デフォルトの名無しさん:2011/04/11(月) 07:18:33.35
>- 例外が発生するくらいなら強制終了させる
Visual C++ではunexpectedがまともに動きませぬ
649デフォルトの名無しさん:2011/04/11(月) 09:11:04.70
例外安全、か?
650デフォルトの名無しさん:2011/04/11(月) 13:37:58.41
0xに詳しい方、下記のURLにある質問に答えてみてはどうでしょうか?
C++0x 12
http://hibari.2ch.net/test/read.cgi/tech/1298470844/
651デフォルトの名無しさん:2011/04/12(火) 00:27:52.91
メンバ関数についての質問
処理が同じconstメンバ関数と非constメンバ関数をもっとスマートに記述する方法ありますか?

class Hoge
{
public:
  string & GetName() { return this->name; }
  const string & GetName() const { return this->name; }

private:
  string name;
};

「return this->name;」の部分がもっと複雑だったばあいの処理を一箇所にまとめたいんだけど・・・
652デフォルトの名無しさん:2011/04/12(火) 00:57:44.44
return const_cast<string &>(const_cast<const Hoge *>(this)->GetName());
653デフォルトの名無しさん:2011/04/12(火) 01:02:34.17
654デフォルトの名無しさん:2011/04/12(火) 01:03:16.24
最初はstatic_castでいんでね
const string & GetName() const { return this->name; }
string& GetName()
{
return const_cast<string&>( (static_cast<const Hoge*>(this)->GetName() )
}
655デフォルトの名無しさん:2011/04/12(火) 01:16:32.98
>>652-654 レスthx
やっぱりそれしか無いか・・・

656デフォルトの名無しさん:2011/04/12(火) 01:56:55.50
>>655
設計を見直す。
657デフォルトの名無しさん:2011/04/12(火) 02:00:25.85
>>655 何が気に入らないの?
658デフォルトの名無しさん:2011/04/12(火) 02:19:32.14
>>656
設計を見直すために参考になるソース等を頂けるとうれしいです

>>656
あーいや、ちょっとソースが見づらくなるなと思っていたんだ
659デフォルトの名無しさん:2011/04/12(火) 09:43:24.50
例があくまでも例なのかもしれないけど、データメンバの参照を返すのってどうなのかな、と思わなくも。
660デフォルトの名無しさん:2011/04/12(火) 10:38:40.81
>>658
別にcppの中に掩蔽してしまえばいいんでね?
そもそも割と有名なイディオムだからそんなに可読性は落ちない
気持ち悪く思うのは最初だけ
661デフォルトの名無しさん:2011/04/12(火) 14:07:50.17
>>659
非const側の関数の問題?
この関数を削除して、変数nameを操作する関数をHogeクラスに追加するのが面倒だと思った
危険性は理解しているし、使いどころを分けているから大丈夫

>>660
そういうものか。これからそうするようにしてみるよ
662655:2011/04/12(火) 19:01:44.37
>>659に指摘していただいたアクセッサ・・・というかミューテータもかな
自分は大体の場面で下記のような定義をするんだけど、
Outerクラスについてのレビューをして頂けますか?

class Inner
{
public:
  typedef boost::shared_ptr<Inner> shared_ptr;
  typedef boost::shared_ptr<const Inner> shared_const_ptr;

  shared_ptr Create() { return shared_ptr(new Inner()); }
};

class Outer
{
public:
  Outer()
    : inner(Inner::Create()) {}

  void SetValue(int value) { this->value = value; }
  int GetValue() const { return this->value; }

  // void SetName(const string & value) { this->name = value; }
  string & GetName() { return this->name; }
  const string & GetName() const { reeturn this->name; }

  void SetInner(const Inner::shared_ptr & value) { this->inner = value; }
  Inner::shared_ptr GetInner() { return this->inner; }
  Inner::shared_const_ptr GetInner() const { return this->inner; }
...
663655:2011/04/12(火) 19:03:52.32
...
private:
  int value;
  string name;
  shared_ptr inner;
};

nameの変更を保護したいばあいは
「string & GetName() { return this->name; }」
を定義しない

nameを保護しないで、string型のメンバ関数を自由に使いたいばあいは
「void SetName(const string & value) { this->name = value; }」
を定義しない

独学な部分が多々あるから、何かとんでもないミスをしていて、自分がそれに気付いていないのかもと思った
664デフォルトの名無しさん:2011/04/12(火) 21:08:05.36
これだけだと判断に苦しむが
存在しない参照が残る可能性を残すデメリットよりも、
コピーによるデメリットが大きいかどうかじゃないだろうか
実際参照を返すことが最良な場合だってあるわけだし
ところで蛇足ではあるがCreateはstaticでは?
665デフォルトの名無しさん:2011/04/12(火) 23:16:08.72
参照を用いたメソッドチェーンを行いたい場合以外の用途が思いつかなかった。

>>662って、それ以外になんかのメリットあるのかな。
そう記述することの意図が汲み取れなくてごめん。
666655:2011/04/13(水) 00:23:50.70
>>664-665 レスサンクス

[修正]
shared_ptr Create() { return shared_ptr(new Inner()); }

static shared_ptr Create() { return shared_ptr(new Inner()); }

shared_ptr inner;

Inner::shared_ptr inner;

変数nameの非const GetName() については、例えば outer->GetName().replace(... とかそんな感じで使用することを想定しています
非const参照を得る方法を提供しないで、Outerクラスで同じ関数を用意するべきですか?
実際は非const側の GetName() はほとんど使わないのですが

void GetName(string * pOutput) {
  *pOutput = this->name;
}

とかの方がいいですか?
667デフォルトの名無しさん:2011/04/13(水) 02:58:50.33
>>666
だからさ、どうするべきかってのは要求に応じて変わるんだよ。
要求や心配している点を示さずに「するべきですか?」とか「〜の方がいいですか?」とか
聞かれても何とも言いにくい。何を言っても後で「実は・・・」とか出てきそうでな。
668655:2011/04/13(水) 03:45:11.72
std::string型メンバ変数のアクセッサの定義について、定石や「自分ならこうする」というこだわりを知りたい
第一要求として速度重視。その次にコードの見易さ
669デフォルトの名無しさん:2011/04/13(水) 04:00:59.73
>>668
その要求なら参照返しでFA。
コピーしたら遅くなるし、コードの見易さも変わらないからね。
放り出した参照がどこかで握られてるかもしれないっていう点で
見易さが損なわれてるかもしれないけど、速度のほうが優先みたいだし。
670デフォルトの名無しさん:2011/04/13(水) 04:03:22.42
参照の危険性を示すために NameRef() とかにしとけばいいんじゃない?
速度が要らないところで安全にコピーを返す Name() も両方付けとくとか。
671デフォルトの名無しさん:2011/04/13(水) 13:32:17.67
PHPのコードを実行できる、C++用のDLLってありますか。
JavascriptではSpiderMonkeyとかV8はありますが。
672デフォルトの名無しさん:2011/04/13(水) 16:02:22.40
>>666
メソッドチェインが使いたかった、と書けばいいのに
673デフォルトの名無しさん:2011/04/13(水) 16:45:46.94
>>671
PHPEmbed ってのがあるらしい
674デフォルトの名無しさん:2011/04/13(水) 17:45:14.31
>>673
サンクス
675デフォルトの名無しさん:2011/04/13(水) 18:46:49.14
>>666
質問の対象範囲外だとは思うけどまずはメンバのアクセサ提供する必要があるのかを問題にするべきだと思う。
特に shared_ptr を外部から設定できるとか NULL 設定されてもいいのかよ、みたいな。
メンバの参照さらしたりセットできるってことはクラス内で常にメンバが満たしているべき条件が保証できないかもしれない。
676デフォルトの名無しさん:2011/04/13(水) 21:19:01.02
複数個の可変長データを、バッファchar *buf = new char [1<<24]へ記録したいです。
何かいいライブラリありますか。OSなどがおこなうメモリ管理と同じような事と思いますが。
677デフォルトの名無しさん:2011/04/13(水) 21:33:15.73
vectorに突っ込めばいいんじゃね?
678デフォルトの名無しさん:2011/04/13(水) 21:36:27.44
vector<string>とかですか?
メモリの再確保をしたくないのですが。
速度のため。
679デフォルトの名無しさん:2011/04/13(水) 21:39:07.84
ロックのかかっている領域は●として。
確保したメモリ全体を
○○●●○○○○●○○●●●○○○として。
白い○部分から、必要なメモリを確保してきたいって事です。
空きが無くなったら、登録を外して外部記憶へ書き出します。


680デフォルトの名無しさん:2011/04/13(水) 21:39:13.59
速度を気にするならC++をやめろよ
681デフォルトの名無しさん:2011/04/13(水) 21:41:16.04
計測して、アルゴリズムを変えて、それでもまだ本当にメモリ確保がボトルネックになっているなら考えればいいことだな
682デフォルトの名無しさん:2011/04/13(水) 21:41:54.30
速度を気にするならどの言語を使えばいいの
C以外だと
683デフォルトの名無しさん:2011/04/13(水) 21:43:03.39
アセンブラでおk
684デフォルトの名無しさん:2011/04/13(水) 21:43:52.55
>>681
動的確保でやってみてボトルネックになっていてから、こだわることにします。
685デフォルトの名無しさん:2011/04/13(水) 21:49:38.94
2^24B=16MBくらい一括でnewなりmallocなりできると思うんだが。
それともOSが載ってなかったりするの?
686デフォルトの名無しさん:2011/04/13(水) 21:50:16.94
>>679
これはごくごく一般的なメモリアロケータがやる仕事と同じでは?
メモリが足りなくなったときの動作が違うけど

なので、適当なアロケータのソースを見ればよいと思う
基礎知識が何もないのなら
http://video.google.com/videoplay?docid=2914803742593360351#
この辺が参考になるかも
687684:2011/04/13(水) 21:58:02.39
しかしSTLは最大2倍まで無駄にメモリ確保するのとと、一度確保されたら縮まないという欠点が。
16M分使うと、32M確保してたら、その差の部分をバッファに使った方が得なんですが。
688デフォルトの名無しさん:2011/04/13(水) 22:01:02.35
>>687
いやだから、気になってるのがSTLなら、いきなりアロケータを手作りせずに
単にmalloc()やnew使えばいいでしょ
689デフォルトの名無しさん:2011/04/13(水) 22:02:18.87
じゃあ初めに固定長で必要な量取っとけばいいじゃない。
そして内部で切り分けたらいいよ
690デフォルトの名無しさん:2011/04/13(水) 22:03:29.44
>>689
その切り分けをして空いた領域を取得する上で
フりーリスト管理なりベストマッチサーチなりの
アルゴリズムがいるわけで、要するにやることがメモリアロケータと全く一緒
691デフォルトの名無しさん:2011/04/13(水) 22:37:22.29
>>687
CPUがひまそうなときに縮めればいいと思うよ。縮められるから。
692デフォルトの名無しさん:2011/04/13(水) 23:13:02.83
>>687
これだけのことを把握して実測できる技術力を持ちながら、こんなところでこんな聞き方しかできないアンバランスさ。
693デフォルトの名無しさん:2011/04/13(水) 23:20:50.33
環境の話が全くないからnewかmalloc使って桶で終わる
694デフォルトの名無しさん:2011/04/13(水) 23:31:12.15
boostのメモリ管理使えばどうだろう
695デフォルトの名無しさん:2011/04/14(木) 01:11:41.34
>>687
std::vector 使うとしても reserve() するとか swap() による shrink to fit を使うとかすれば
そこらへんの問題もどうにかなるだろ。
696デフォルトの名無しさん:2011/04/14(木) 01:20:16.52
>>694 何それ?
697デフォルトの名無しさん:2011/04/14(木) 01:45:45.56
pool_allocatorじゃないの
698デフォルトの名無しさん:2011/04/14(木) 01:54:56.27
>>694,697
boost::pool は固定長で大量の確保を高速化するものだったような気がする。
>>676,679 みたいな可変長の要求にも役に立つのかね?
699デフォルトの名無しさん:2011/04/14(木) 02:00:59.98
>>698
それはfast_pool_allocatorで実際はpool_allocatorが役に立つ。
700デフォルトの名無しさん:2011/04/14(木) 07:55:46.16
>>687
ただの馬鹿だったか
701デフォルトの名無しさん:2011/04/14(木) 08:21:47.03
>>679
>って事です。
ここまでのはSimple Segregated Storageってのでそのまま実現できる。boost::pool_allocatorも同じ方式

>空きが無くなっ
これは自分で実装する必要があると思う
702デフォルトの名無しさん:2011/04/14(木) 15:07:12.87
速いCPUで速いメモリのマシンに買い換えろ
が正解でないか?
703デフォルトの名無しさん:2011/04/14(木) 15:41:08.26
今CPUもメモリもビデオカードも安いから正直買い換えが苦にならない
704デフォルトの名無しさん:2011/04/14(木) 17:23:29.57
C++でオープンソースの画像ビューアで書庫が扱えるものはありませんか?
705デフォルトの名無しさん:2011/04/14(木) 17:26:52.79
すみません。書庫のロード部分が知りたいので、オープンソースのMP3プレーヤーでもかまいません。
706655:2011/04/14(木) 17:31:51.49
亀レスですまん

>>669
実際に参照を多用しているんだけど、結構危ないのかなぁと思ったんだ
でも、外部からメンバ参照を操作されたくなければ string & GetName() 非const を提供しなければいい話だし
>>672でも言われている通りメソッドチェインが使えると効率がいいからなぁ

>>675
一応だが、>>662のソースコードではshared_ptrの参照は非constでは返してない。
shared_ptrでの戻り値は習慣的に値返ししているけど、
「const Inner::shared_const_ptr & GetInner() const { ... } 」
みたいに const shared_ptr & を返すのもアリなんですか?
マルチスレッドだと値返しは危ないという理解で合ってますか?

>>670
関数名は考慮が必要かもしれませんが、
「const string & GetNameA() const」が存在する状況でコピーを返す関数、例えば
「void GetNameB(string * pName) const」は必要ありますか?
参照を取得できれば、外部から「string s(outer.GetNameA());」といった感じにコピーできるので・・・
707655:2011/04/14(木) 17:32:16.16
亀レスですまん

>>669
実際に参照を多用しているんだけど、結構危ないのかなぁと思ったんだ
でも、外部からメンバ参照を操作されたくなければ string & GetName() 非const を提供しなければいい話だし
>>672でも言われている通りメソッドチェインが使えると効率がいいからなぁ

>>675
一応だが、>>662のソースコードではshared_ptrの参照は非constでは返してない。
shared_ptrでの戻り値は習慣的に値返ししているけど、
「const Inner::shared_const_ptr & GetInner() const { ... } 」
みたいに const shared_ptr & を返すのもアリなんですか?
マルチスレッドだと値返しは危ないという理解で合ってますか?

>>670
関数名は考慮が必要かもしれませんが、
「const string & GetNameA() const」が存在する状況でコピーを返す関数、例えば
「void GetNameB(string * pName) const」は必要ありますか?
参照を取得できれば、外部から「string s(outer.GetNameA());」といった感じにコピーできるので・・・
708655:2011/04/14(木) 17:33:42.34
重複投稿したかも。失礼しました
709デフォルトの名無しさん:2011/04/14(木) 19:49:05.28
ZIP書庫のZIP書庫内にテンポラリ作らずアクセスする方法ありますか?
710デフォルトの名無しさん:2011/04/14(木) 20:17:04.10
方法はあるよ。
ただ、それを行うライブラリとかの存在はしらない。
711デフォルトの名無しさん:2011/04/14(木) 20:39:51.88
>>709
http://zlib.net/
ここのexampleとmanual見ればいいんじゃないか
ちょっと見てみたら、メモリに展開するって書いてあったし
712デフォルトの名無しさん:2011/04/14(木) 20:57:52.16
zlibとzip(32,64)は別ですが。avi、mp4、flvと動画エンコードのような。
713デフォルトの名無しさん:2011/04/14(木) 21:08:58.71
>>686
パワーポイントの方は見た事あったけど、動画は初めて見たわ。
面白かった。ていうか、じゃんじゃんうっせーよw
714デフォルトの名無しさん:2011/04/14(木) 21:21:33.18
>>712
コンテナとコーデック
715デフォルトの名無しさん:2011/04/14(木) 22:02:05.78
zlibって展開する所だけなのね
てっきりzipの読み込みまで入っているのかと思ってた
一応サンプルにminizipってのがあるらしいから、参考にはできるかもしれないけど

7zipもzip使えるみたいだから、そっちの方が楽かな?
716デフォルトの名無しさん:2011/04/14(木) 22:16:58.51
書庫の書庫が読めるサンプル、コード見つからないです・・・
717デフォルトの名無しさん:2011/04/14(木) 22:23:35.57
再帰って知ってる?
718デフォルトの名無しさん:2011/04/14(木) 22:30:46.13
>706
言いたかったのは SetInner(Inner::shared_ptr()); されてもいいのか?って事。使う時に毎回有効性のチェックする?
もっと言うとクラスのインタフェースはその機能によって定められるべきで
メンバによって定められるべきではないと思う。本当にアクセサが必要なの?

>const shared_ptr & を返すのもアリなんですか?
個人的にはナシ。

>マルチスレッドだと値返しは危ないという理解で合ってますか?
いや、まずいのは参照返しの方だろ?
実体より寿命の長い参照に設定された場合が駄目なのでマルチスレッドでなくても
駄目な場合は発生しうる。

>「void GetNameB(string * pName) const」は必要ありますか?
>670 が言っているのは string GetNameB() const だと思う。
そして個人的には const string & 返すのがあれば不要だと思う。
むしろ void GetNameB(string &name) const を作るかもね。
719デフォルトの名無しさん:2011/04/14(木) 23:06:13.73
>>717
テンポラリに展開なしで出来ますか?
720デフォルトの名無しさん:2011/04/14(木) 23:27:57.34
>>719
自分で調べる気一切ないみたいだから諦めた方がいいよ
721デフォルトの名無しさん:2011/04/15(金) 00:25:08.24
動作中のプログラムだけでいいので、
マウントとのように動作するライブラリを作れば
何階層でも読みに行けることになる。
722デフォルトの名無しさん:2011/04/15(金) 12:02:14.30
setjmpとlongjmp関連についての質問です。

C++の例外と相性がわるいと書かれている記事をみかけました。

リンクしたいC言語で書かれたいライブラリのとある関数のなかで、
setjmpとlongjmpが使用されておりました。

実際には例外処理てきな使われです。

どのような状況で利用するとC++的にはまずいのでしょうか?
723デフォルトの名無しさん:2011/04/15(金) 12:03:49.75
>>722
例外と共存させるとデストラクタが呼ばれないので拙い(。
Cで書かれたいライブラリの中で閉じている分には無関係。
724デフォルトの名無しさん:2011/04/15(金) 12:12:22.54
longjmp()でのスタックアンワインドではデストラクタが呼ばれないのが問題

if (setjmp(...) == 0) {
 tryブロック相当
 longjmp()を呼ぶかもしれないCの関数を呼んだりとかする
} else {
 longjmp()がよばれた。エラー処理とかする
}

こんな感じの書き方になると思うけど、上のtryブロック相当のところで
デストラクタ呼び出しが必要なC++コードを記述してしまうと
デストラクタが呼ばれなくなってしまう
逆にそうしなければ、基本的には問題ないはず
725デフォルトの名無しさん:2011/04/15(金) 12:12:48.69
>>723 例外関係なくね?
726709:2011/04/15(金) 12:39:02.76
ZIPの書庫の書庫へのアクセス教えてください。
MP3や画像ビューアなど、テンポラリなしでダイレクトに読みに行くのがあると思うのですが。
727デフォルトの名無しさん:2011/04/15(金) 12:51:04.35
zipは、格納されてる個々のファイルにはシークでランダムアクセス可能な
構造になってるけど
deflate圧縮されたファイルの中身は無圧縮zipでない限りは
ランダムアクセス不能なので
シークエンシャルにロードできるような形式でなけば
結局メモリかファイルに一度全体を展開する必要はある
でかいAVIのようなものをを全部オンメモリ展開するのははた迷惑なので、
結局一時ファイルがベストという判断もありえるよ
728デフォルトの名無しさん:2011/04/15(金) 13:10:22.12
>>723-724
レスありがとうございます。
C++の例外機構内で使用しなければよさそうですね。

ありがとうございました。
729デフォルトの名無しさん:2011/04/15(金) 13:13:33.92
アーカイバとコンプレッサーはべつやがなーってことでいいのかい?
730デフォルトの名無しさん:2011/04/15(金) 13:14:46.06
>>728
いや、実際に問題になるのはデストラクタの利用。
例外送出時の問題はその一例。
731デフォルトの名無しさん:2011/04/15(金) 13:20:23.48
>>730
>>724さんの例のようにデストラクタを、
呼ばなければならないシーンを飛ばしてしまうことがある。

なので利用するときはC++での利用は推奨されない。
また、利用先のCライブラリないで閉じているならば問題ではない。

ということでよろしいでしょうか・・・。
732723:2011/04/15(金) 13:25:19.34
>>725
あー確かに。例外関係なく、デストラクタを無視しちゃうのが問題だね。
Cで書かれたライブラリ内で閉じている分には関係ないが、
C++のコード内では(事実上)使えないと。
733デフォルトの名無しさん:2011/04/16(土) 19:27:13.45
書庫の書庫内を読み取るソースありますか?
5ギガのzipがあり、その中に500メガ〜1000メガの書庫が格納されている場合、
アクセスのたびにテンポラリに解凍しては激遅になります。
書庫形式からダイレクトに読みにいくのは可能なはずなんですが。

734デフォルトの名無しさん:2011/04/16(土) 19:53:16.03
ないのでお引き取りください
735デフォルトの名無しさん:2011/04/16(土) 20:34:53.44
ないのか
このソフトはどう動いてるのかわかりますか?
書庫をマウントして、その書庫内もマウントして、読み込めるのですが。

http://itpro.nikkeibp.co.jp/article/COLUMN/20110405/359103/?ST=system
736デフォルトの名無しさん:2011/04/16(土) 20:43:55.62
格納ファイルの先頭からなら、読み込めて、書庫内の書庫のファイルは読み込めないのか。
しかしテンポラリ作らず読んでいそうなソフトもあるが。>>735とか。
737デフォルトの名無しさん:2011/04/16(土) 20:53:49.70
やっぱ出来るな。
書庫情報には格納前と圧縮後サイズが記録されているから
書庫内の書庫の途中から、ファイルデータを取り出せるはず。
738デフォルトの名無しさん:2011/04/16(土) 21:01:23.63
2度目の圧縮で位置がずれるから無理か。あきらめた。
739デフォルトの名無しさん:2011/04/16(土) 21:29:29.94
何度も何度も馬鹿の一つ覚えで質問して自分の脳みそないのかよって感じだが
君が探すべきなのはテンポラリを使わない方法では「なく」、一度作成したテンポラリを
再利用する方法じゃないのかね?
740デフォルトの名無しさん:2011/04/16(土) 22:46:34.41
>>739
横レスだが、
質問者の処理の対象となる書庫は、
毎回違うのかもしれんよ。
そのへんの考察もできずに、上から目線とは
目くそ鼻くそかもよw
741デフォルトの名無しさん:2011/04/16(土) 23:25:49.42
>740
かもしれんね。だとすれば >727 で話は終わっている。
742デフォルトの名無しさん:2011/04/17(日) 01:08:27.67
メンバ関数のデフォルト引数にそのクラスのメンバ変数を入れようとしたら
invalid use of non-static data member
とg++にいわれました
何がいけないんでしょう?
743デフォルトの名無しさん:2011/04/17(日) 01:49:37.62
>>742
>何がいけないんでしょう?
エラーメッセージも読めないあんたの頭
744デフォルトの名無しさん:2011/04/17(日) 03:14:40.56
いやまぁ言ってることはわかるんだが、理由がわからんw

メンバ関数が呼ばれるときには、それを実行するインスタンスはわかっているわけで
なぜわかっているはずのメンバ変数をデフォルト引数に突っ込むことができないの?
という話です
745デフォルトの名無しさん:2011/04/17(日) 03:38:57.21
staticでないメンバ変数はインスタンスごとに存在するわけで
メンバ関数のデフォルト引数としてどのインスタンスの変数が使用されるか特定できないじゃないか

codepadだと↓ならOK。

class T
{
public:
T(){}
~T(){}
static int X;
void func(int y=X){ printf("%d\n",y);}
};
int T::X=3;
746デフォルトの名無しさん:2011/04/17(日) 10:08:53.52
>745
>メンバ関数が呼ばれるときには、それを実行するインスタンスはわかっているわけで

勝手な想像だけど、実現したいことはメンバ関数のオーバーロードで簡単に実現できるのに
デフォルト引数でやろうとすると仕様の整合性をとるのが面倒だったから、とかじゃない?
特に仮想関数のデフォルト引数が静的に解決されるってのあたりと。

struct A { virtual void func(int n = 1) {} };
struct B : public A { virtual void func(int n=3) {} };
B b; A *pa = &b; pa->func();

で、3 で呼び出すの?みたいな。
747デフォルトの名無しさん:2011/04/17(日) 10:31:39.16
>メンバ関数が呼ばれるときには、それを実行するインスタンスはわかっているわけで

分かるわけがない。
確定するのは呼ばれる時ではなく、呼ばれた後。
仮想関数とかクラスの仕組みを勉強し直せ。
748デフォルトの名無しさん:2011/04/17(日) 13:50:56.71
>747
メンバ関数呼ぶ時に this 渡してるんだからそれ使って解決してくれよ、って話じゃないの?
749デフォルトの名無しさん:2011/04/17(日) 14:33:45.10
あるクラスの関数の実体はひとつでしょ。
どのインスタンス(の変数)が使われるかなんて動的にしかわからないじゃん。
750デフォルトの名無しさん:2011/04/17(日) 15:19:03.44
callする前にthisをスタックに積むんだから、
this->hogeも積めるんじゃないかっていう事かな。
751デフォルトの名無しさん:2011/04/17(日) 16:18:47.90
インラインはなるべく使わない方がいい。
CPUのキャッシュは少ない。沢山の関数がキャッシュに載れば弾かれるものも多くなる。
たとえば5カ所で関数を呼び出すなら、インラインにせずキャッシュから読ませた方が速い。
752デフォルトの名無しさん:2011/04/17(日) 16:22:03.40
それぞれの段階で段違いに速度差がある。 
HDD << メモリ << CPUキャッシュ
なるべくメモリを読みに行かせない、なるべくHDDを読みに行かせない点がポイント。
インラインは、コーディングでの見やすさの為に分離した場合は有効。

753デフォルトの名無しさん:2011/04/17(日) 16:25:13.76
メンバ関数って暗黙でthisが渡されるからインスタンスごとの動作できるって事でいいんだよね?
俺なんか勘違いしてる?
754デフォルトの名無しさん:2011/04/17(日) 16:26:33.98
してないよ
755デフォルトの名無しさん:2011/04/17(日) 18:38:30.43
いいんだよ
756デフォルトの名無しさん:2011/04/17(日) 19:02:51.07
勘違いしてる。仕様と実装は分けて考えた方がいい
757デフォルトの名無しさん:2011/04/17(日) 19:24:10.21
↑バカ
758デフォルトの名無しさん:2011/04/17(日) 22:15:41.63
アウトライン展開
759デフォルトの名無しさん:2011/04/17(日) 22:46:46.02
>callする前にthisをスタックに積むんだから、
デフォルトの引数は、コンパイル時に#defineと同じように実命令が変換されるより先に展開されるの。
だからインスタンスがなんなのかなど、コンパイラがその時点で判断できようはずが無い。
なんでそんな簡単なことも理解できないんだ?
760デフォルトの名無しさん:2011/04/17(日) 22:51:33.80
仮想関数との組み合わせの話はメンバ変数を参照してもしなくても同じことだから
切り分けて考えるんだ。
761デフォルトの名無しさん:2011/04/17(日) 23:02:00.39
foo.bar()をfoo.bar(foo.baz)に展開しろって話してるんだと思ってたけど
どうもそうじゃなかったようだ
762デフォルトの名無しさん:2011/04/17(日) 23:38:54.09
毎回亀レスで悪い
>>718
> 実体より寿命の長い参照に設定された場合が駄目なのでマルチスレッドでなくても
> 駄目な場合は発生しうる。
ごめん、「実体より寿命の長い参照に設定された場合」っていうのはどんな時?
ちょっと分からなかった
763デフォルトの名無しさん:2011/04/17(日) 23:46:47.71
>>747
デフォルト引数は静的な型から決定されるからthis使って解決出来ないじゃん。
>>746
この場合は、B::funcの引数には1が渡されるってこと・・・で合ってるよね?
764デフォルトの名無しさん:2011/04/18(月) 00:55:20.70
俺も >761 な話だとずっと思ってるんだが >759 辺りと話が噛み合わないんだ。
仮想関数呼び出しの時の this は動的な型になってるから仮想関数の例とか this どうこう書いたのは良くなかったかもしれない。

コンパイラとしては >761 のように解決すれば良いだけだから実装自体は可能だと思う。
ただし、この場合デフォルト引数を「動的」に解決しているわけだから仮想関数のデフォルト引数が「静的」に解決されるのと
仕様的な整合性が取れていないと思う。
それならってんで、仮想関数のデフォルト引数も動的に解決しようとした場合、仮想関数の解決と同様の仕組みを導入しなければならず
メンバ関数のオーバーロードで簡単に実現できることに対してそこまで頑張る必要はない、という判断からデフォルト引数は全て
静的に解決する仕様になったのではないか?、というのが >746 で言いたかったことなんだけど言葉足らずだったかも。

>763
>この場合は、B::funcの引数には1が渡されるってこと・・・で合ってるよね?
合ってる。
765デフォルトの名無しさん:2011/04/18(月) 07:52:40.48
言語仕様的に無理なんだから、グダグダ言ったってどうにかなる物でもないだろうに。
こういう無い物ねだりで余計なことに無駄な時間を割くから、
馬鹿の考え休むに似たりって言われるんだよ。
766デフォルトの名無しさん:2011/04/18(月) 09:45:58.86
行列って列と行のどっちが一続きの列(ONE PIECE)になるのがふつうですか?
逆にしてしまうとライブラリー使うとき全部変換しないといけなさそうで困りますよね☆
767デフォルトの名無しさん:2011/04/18(月) 12:46:45.89
そうかもしれませんねミ☆
768デフォルトの名無しさん:2011/04/18(月) 13:04:03.78
>>766
一人で縦書きの世界にこもってろ
769デフォルトの名無しさん:2011/04/18(月) 13:06:07.71
ゴムゴムの〜
770デフォルトの名無しさん:2011/04/18(月) 15:11:34.58
a a a a a
b b b b b
c c c c c
d d d d d
という行列があるとするでしょ?
それを格納するのにabcdabcdabcdabcdとするか
aaaabbbbccccdddddにするのかどちらが普通ですか?
という簡単な質問のつもりですよ?
771デフォルトの名無しさん:2011/04/18(月) 15:22:52.28
X[0]=aaaa
X[1]=bbbb
X[2]=cccc
X[3]=dddd
772デフォルトの名無しさん:2011/04/18(月) 15:25:15.73
>>711
構文エラー
773 忍法帖【Lv=14,xxxPT】 :2011/04/18(月) 15:26:13.94
使うライブラリに合わせるだけのことでしょ。
自前でやるならフラグで解釈を切り替えられるようにしておくと、逆行列が瞬時に得られるw
774デフォルトの名無しさん:2011/04/18(月) 15:29:06.75
逆行列じゃなくて転置行列じゃねーの?
775デフォルトの名無しさん:2011/04/18(月) 15:29:40.60
m11,m12・・・
が普通じゃないの?
776デフォルトの名無しさん:2011/04/18(月) 15:30:34.51
使うライブラリーが色々種類あるでしょ。それらは規格を統一してないから
どっちが普通かきいているのは明らか。
777デフォルトの名無しさん:2011/04/18(月) 15:48:42.49
DirectXの固定機能とシェーダに突っ込む行列はお互い転置。
つまり普通なんてない。
そもそもスレ違い。
778デフォルトの名無しさん:2011/04/18(月) 15:51:33.93
しりませんでした
ネットで調べてきます
あした学校なので
ほうか後また書き込みますね。
779デフォルトの名無しさん:2011/04/18(月) 15:56:09.72
aaaabbbbccccdddddで格納した1次元配列をAPIによって行列操作してあげればいいんじゃないかな?
780デフォルトの名無しさん:2011/04/18(月) 15:58:05.85
aaaabbbbccccdddd説がおおいなぁ
やっぱパソコンの画面の座標と一致しているのかなぁ。
781デフォルトの名無しさん:2011/04/18(月) 16:16:35.94
まあアドレス計算考えたらこっちのほうがとかあるんじゃないかな?
まあ普通に4*4の配列でもいいとおもうよ。

コンパイル後は配列のほうが早い場合もおおいらしいしね。
782デフォルトの名無しさん:2011/04/18(月) 16:22:34.23
数値解析だと縦の場合もしばしば。
実際には、可変長の配列の配列は作れないから効率重視ならリニアにメモリを確保してオフセット計算して使うことになる。
その場合、縦か横かはオフセット計算の違いだけになる。
783デフォルトの名無しさん:2011/04/18(月) 16:41:38.01
>>782
CPUのパイプラインキャッシュが有効になるかどうかという違いもでてくる
784709:2011/04/18(月) 17:54:29.88
書庫内の書庫内にアクセスするのにキャッシュを使う方法でプログラム作りました。
7-zip32.DLLというのを使いました。
速度を測ると、書庫内のファイルリスト取得(書庫のopen)がボトルネックになっています。
書庫のファイルリストを高速で取得できるライブラリ、ソースはありますか?
ヘッダ情報を読むだけでそれほど時間かからないはずですが、このDLLは遅いです。

785デフォルトの名無しさん:2011/04/18(月) 21:07:32.01
だったら自分で作れば?
ボトルネックが判っててそこまで言うならできるでしょ
786709:2011/04/18(月) 21:36:34.01
zipには様々な亜種があるんで自作は大変なんですが。
7-zipは多くのフォーマットに対応していいんですが。
7-zipのソースに直接アクセスしてみます。
787デフォルトの名無しさん:2011/04/19(火) 11:23:11.33
なんか日本語がおかしいね。
788デフォルトの名無しさん:2011/04/19(火) 12:28:29.98
当然のごとく、日本語がおかしい人間はプログラムもまともに組めないよ。
789デフォルトの名無しさん:2011/04/19(火) 12:55:26.98
Base64と似たブツ。Base64はエンコード手順が面倒で簡単なエンコード開発した。

#include <iostream>
#include <string>
static std::string enc64code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_";
std::string base64enckai(const std::string ch ) {
unsigned int x,n=0; std::string str;
do{ x=0;
if(n+2<ch.size()) memcpy(&x,&ch[n],3);
else if(n+1<ch.size()) memcpy(&x,&ch[n],2);
else memcpy(&x,&ch[n],1);
n+=3;
for(int i=0; i<4; i++) { str+=enc64code[x%64]; x/=64; }
}while(n<ch.size()); return str; }

std::string base64deckai(const std::string ch ) {
static std::string inv; static flg=0;
unsigned int x,n=0,i;
if(!flg) { inv.resize(128); for(i=0;i<enc64code.size();i++) inv[enc64code[i]]=(char)i; }
std::string str;
do {
x=0; for(i=0; i<4 ; i++) x+=inv[ch[n+i]]<<(6*i);
n+=4;
i=str.size(); str.resize(i+3); memcpy(&str[i],&x,3);
}while(n<ch.size()); return str; }

int main(){
std::string a="C++に関する質問やら話題やらはこちらへどうぞ。";
std::string b=base64enckai(a);std::string c=base64deckai(b);std::string d=base64enckai(c);
std::cout<<"moto a=\""<<a<<"\"\n"<<"test b=enc(a); c=dec(b); d=enc(c);\n";
std::cout<<"a==c? "<<(a==c?"True":"False")<<"\n";
std::cout<<"b==d? "<<(b==d?"True":"False")<<"\n"; }
790709:2011/04/19(火) 14:09:29.72
Info-Zipか7-zipに直にアクセスしたいのですが。やり方わかりますか?
ソース落として動かそうとしたらわかりませんでした。
791デフォルトの名無しさん:2011/04/19(火) 15:15:03.02
7-zip32.dllのロード部分。
http://ideone.com/p4aEb
792デフォルトの名無しさん:2011/04/20(水) 10:31:09.71
>>784は同じ書庫を何度もオープンしていたからでした。
下位の書庫の存在確認のために、上位から順に開いていって確かめてました。
格納ファイル情報もキャッシュしたら解消できました。
793デフォルトの名無しさん:2011/04/20(水) 10:41:25.67
QACのような性的解析ツールで無料で使えるもので
おすすめはなにがありますか?
NULLポインタアクセスとメモリリーク検知が出来れば
あとはまあどうでもいいです。
794デフォルトの名無しさん:2011/04/20(水) 10:49:53.48
ぼくも性的アクセスしたいです!
795デフォルトの名無しさん:2011/04/20(水) 11:04:30.88
struct Boo{};
int buf[64];
Boo* b = new(buf) Boo[3];
とやると
buf[0]に3が入ったり入らなかったりするんですがどういう規定があるんでしょうか。
796デフォルトの名無しさん:2011/04/20(水) 11:09:19.73
>>795
規定がないのでゴミが残る
797デフォルトの名無しさん:2011/04/20(水) 14:10:13.05
>>795
よくある実装では、 Boo に対してデストラクタ呼び出しが必要かどうかで変わる。
その場合 3 が入ってるかどうかと static_cast<void*>(b) != &buf[0] が連動してるはず。
798デフォルトの名無しさん:2011/04/20(水) 14:14:40.86
>>793
cppcheck とかいうやつがあるから使ってみれば?
http://sourceforge.net/apps/mediawiki/cppcheck/
結果を教えてもらえるとうれしい。

初歩的なメモリリーク検知には grep delete ... でも有効だったりする。
単品 delete があれば std::auto_ptr に、配列 delete があれば std::vector に変えて消していく。
799デフォルトの名無しさん:2011/04/20(水) 14:23:11.06
メモリリークはvisualC++つかえよ。普段使って無くても、検査の時だけつかえよ。簡単。
800デフォルトの名無しさん:2011/04/20(水) 14:30:22.51
>>799
ちょっwww、どうやってVCで検査すんお!??
801デフォルトの名無しさん:2011/04/20(水) 14:45:30.41
#include <crtdbg.h>
802デフォルトの名無しさん:2011/04/20(水) 14:48:33.42
第八報:メモリリークと crtdbg.h
http://www7b.biglobe.ne.jp/robe/pf/pf008.html

メモリリークの自動検出をしてみる - ベイダー日記
http://d.hatena.ne.jp/wata_d/20080304/1204609100

気まぐれソフトハウス ≫ メモリリークの検出
http://wind-master.dip.jp/soft-info/item/62






803デフォルトの名無しさん:2011/04/20(水) 14:51:42.25
BorlandC++にもcrtdbg.hは存在していてた。しかしMFC 、 ATL.が存在してないから(メモリーリーク検出の)機能はしないと思われる。

BCC、crtdbg.hの中身。
Borland version of Microsoft CRTDBG.H header file This is used by MFC and ATL.
804デフォルトの名無しさん:2011/04/20(水) 14:55:44.27
805デフォルトの名無しさん:2011/04/20(水) 14:56:13.34
おまいら、性的解析を動的解析とごっちゃにしていないか?
>793が欲しいのは性的解析ツールだぞ。
806デフォルトの名無しさん:2011/04/20(水) 15:07:52.02
>>801-804
ありがと〜、おまえら優しすぎて涙が出てきた。
いままで自作のアロケーター作ってそこに開放し忘れ機能しこんでたお。
807デフォルトの名無しさん:2011/04/20(水) 15:08:27.89
visualC++にも静的解析ついた気がするな。
コンパイルに出来た気が。
解析に時間かかりすぎて使ったことはないが。
808デフォルトの名無しさん:2011/04/20(水) 15:15:47.03
>>803
CodeGuardがあるだろ
809デフォルトの名無しさん:2011/04/20(水) 15:41:55.15
>>807
/analyze スイッチか
vcユーザーにとっては一番手軽だな
810デフォルトの名無しさん:2011/04/20(水) 16:08:46.43

現時点では、SALの解釈(/analyze)はVSTSのTeam Developerで有効になっていますが、
最新のWindows SDKに付属のC++コンパイラで利用できる事を確認してます。(※2)

二流プログラマの三流な日常: VC++の開発に於いてSALを使う
http://konuma.txt-nifty.com/blog/2006/08/vcsal_26a1.html
811793:2011/04/20(水) 16:56:01.66
>>798
気に入った! 家に来て妹のコードを性的解析していいぞ
812デフォルトの名無しさん:2011/04/21(木) 15:42:48.61
http://blog.livedoor.jp/sharemi/archives/1082288.html
これより綺麗な可変長テンプレート関数書く方法ないのでしょうか
813デフォルトの名無しさん:2011/04/21(木) 15:51:36.44

可変個の引数関数

fnc("aaa","vvv"); と使う。

*#define fnc(...) fnc_(__VA_ARGS__,NULL)

int fnc_(char *p, ...){
va_list L;
va_start(L, p);
L = (char *)L - sizeof(char*);
char *ch;
while((ch=va_arg(L, char*))!=0)
printf("%s\n",ch);
va_end(L);
}
http://ameblo.jp/cpp-prg/entry-10151372280.html
814デフォルトの名無しさん:2011/04/21(木) 18:39:12.58
>>812
C++0xに対応したコンパイラを使えば、無駄なことをしなくてもそのまま使える。
815デフォルトの名無しさん:2011/04/21(木) 21:10:58.19
>>812
なんでわざわざそれ用に PP が用意してる ENUM_PARAMS とか ENUM_BINARY_PARAMS とか使わずに自前で書くの?
816デフォルトの名無しさん:2011/04/22(金) 09:54:45.05
1から100の連番を64bit数に関連づけるなら配列が良いと思いますが。
1から1億の連番ならどうすればいいですか?
省メモリで速度が速いのが良いです。
817デフォルトの名無しさん:2011/04/22(金) 09:58:53.66
ヒープ
818816:2011/04/22(金) 09:59:57.10
すみません。常に1億個存在するわけではなく最大で一億でした。
1から一億のうちの10%=1000万個程度が出現します。
配列を使う場合の容量はこうです。

8バイト * 一億個 / 2^20 = 763メガバイト。
819デフォルトの名無しさん:2011/04/22(金) 10:09:03.03
要は、大抵は80MB程度で最大763MBか。そのくらいなら普通に配列でもいいんじゃね?w
あー、速度も必要か。どういう速度が必要かによって、vector/deque/map/list好きなの使えばいいんでね?
820デフォルトの名無しさん:2011/04/22(金) 10:18:11.78
>>816,818
struct pair { int_least32_t key; int_least64_t value; };
std::vector<pair> v;
で、 v を常にソート済みに保つ。

sizeof(pair) は典型的には 16 バイトか 12 バイトになると思う。
その場合の容量はこう。

16バイト * 1000万個 / 2^20 = 153メガバイト。

ただしキーで参照するのは O(logN) で、追加削除は O(N) になってしまう。
(配列の場合はいずれも O(1) )

std::map にすれば追加削除も O(logN) に抑えられるけど、メモリ使用量は
たぶん数倍に増えてしまう。
821816:2011/04/22(金) 10:26:04.37
>>819>>820
サンクスです。メモリを実測で測ってみます。
822デフォルトの名無しさん:2011/04/22(金) 12:00:40.25
場合によってはunordered_mapがいいかもね
823デフォルトの名無しさん:2011/04/22(金) 12:29:59.27
template<class iterator, class returntype=typename iterator_traits<iterator>::typename>
returntype func(){
return 1;
}
この関数の戻り値の型をイテレーターの型を指定しないでfunc<int>();見たいに呼び出す方法教えてください。
824デフォルトの名無しさん:2011/04/22(金) 12:38:21.09
>>823
それじゃ iterator の型が定まらないので無理。
825デフォルトの名無しさん:2011/04/22(金) 12:48:08.94
定まるとして考えてみてください。
826デフォルトの名無しさん:2011/04/22(金) 12:50:11.00
定まると仮定すると問題自体が成り立たないように見える。
827デフォルトの名無しさん:2011/04/22(金) 13:07:53.49
>>820
こうなると64bitEXEも実用的になってくるな
しかしCPU自体の速度はさほど向上してないし、STLはマルチコアに対応して
ないしでちょっと苦しいな
828デフォルトの名無しさん:2011/04/22(金) 13:13:50.04
>>826
第一引数にiteratorの引数を持ち、呼び出すときfunction<int>(iterator)と仮定すればなりたつだろ。
829デフォルトの名無しさん:2011/04/22(金) 14:56:09.18
一つのソースコードを、#define(UNICODEなど)指示を変更しながら
自動で複数回ビルドして異なるEXE作る方法ありますか?
830デフォルトの名無しさん:2011/04/22(金) 15:05:55.06
自己解決しました


/D (プリプロセッサの定義)
CL /DDEBUG TEST.C

次のコマンド ラインでは、最初のソース ファイルと同じ名前の実行可能ファイルが C:\BIN に生成されます。
CL /FeC:\BIN\ *.C
831デフォルトの名無しさん:2011/04/23(土) 01:09:48.80
>>828
しかし問題の>>823は明らかに第一引数にiteratorの引数を持ってないんだが。
832デフォルトの名無しさん:2011/04/23(土) 02:46:50.50
>>830
大文字で書かれるとすごい違和感。VMSとかCP/Mとか思い出しちゃう。
833デフォルトの名無しさん:2011/04/23(土) 07:36:07.06
>>823
既定のテンプレートの引数を関数テンプレートで使えるの?
func<int>() って第一のテンプレート型実引数イテレーター
の型を指定していることにならないの?
(ポイントがズレてたらごめん)
834デフォルトの名無しさん:2011/04/23(土) 11:18:13.27
初級者「C++全然わからんw」  
中級者「C++全然わからんw」  
上級者「C++全然わからんw」  
標準化委員会「C++全然わからんw」
顧客「C++分かるよね?」 
営業「もちろんです!!」
835デフォルトの名無しさん:2011/04/23(土) 11:24:20.51
ついったーネタを転載とはやはり天才・・・
836デフォルトの名無しさん:2011/04/23(土) 11:56:08.43
ニュー速じゃね?

初級者「C++全然わからんw」
中級者「C++全然わからんwwww」
上級者「C++全然わからんwwwwwwwwwポゲwwwwww」
標準化委員会「C++wwwww全wwwww然wwwwwwwwわwwwwかwwwらwwwんwwwwwwwwww」
837デフォルトの名無しさん:2011/04/23(土) 12:22:34.25
文字列配列について質問があります。

g++4.4.5では以下のソースはコンパイルできます。
#include <string>
int main(int argc, char *argv[]) {
 std::string foo[argc+10];
}

VCでは配列確保に定数式が求められるため、コンパイルできません。
#include "stdafx.h"
#include <string>
int _tmain(int argc, _TCHAR* argv[]) {
 std::string foo[argc+10];
}

これは、どちらの挙動がより標準に準拠しているのでしょうか?
838デフォルトの名無しさん:2011/04/23(土) 12:27:34.19
コンパイラがどの規格に準拠しているかぐらい、自分で確認しろよ。
839デフォルトの名無しさん:2011/04/23(土) 12:38:15.76
>>837
それgccの独自拡張だから
-ansiつけてコンパイルしてみな
840デフォルトの名無しさん:2011/04/23(土) 12:41:14.57
841デフォルトの名無しさん:2011/04/23(土) 12:46:30.46
>>838-840

ありがとうございます。
勉強になりました。
842デフォルトの名無しさん:2011/04/23(土) 12:57:24.47
HDD内のファイルリスト、URLリストを保存したいのですが、次の条件があります。

・ メモリの占有量が小さい(これを一番重視)
・ 各ファイル(URL)は固有番号をもち、番号からパスを返す関数がある。

これはどのように実現したらいいですか。
843デフォルトの名無しさん:2011/04/23(土) 13:44:54.01
>>842
SQLiteでどう?
844デフォルトの名無しさん:2011/04/23(土) 14:59:32.54
SQLiteでフルパス、番号をそのまま格納するってことですか?
ディレクトリ名だけ記録してツリー構造にしたらメモリ減らせると思うのですが。
しかしこれだと、ディスクへ記録するのと、逆引きの方法がわからないです。
845デフォルトの名無しさん:2011/04/23(土) 15:09:44.80
SQLiteでDBファイルを指定すれば、好きな場所に保存できるだろう
抽出したければ条件を指定すればいいだけだし、
いったい何が疑問なのかさっぱり分からない
846デフォルトの名無しさん:2011/04/23(土) 15:15:03.19
>>844
記録したいデータは何件くらい?
847デフォルトの名無しさん:2011/04/23(土) 15:21:40.53
>>844
俺はやっぱりSQLiteをおすすめするけど自分でやりたいなら
データ挿入の仕方はBツリーとかB+ツリーでググればソース見つかるはず
逆引きは文字列ハッシュ値保存すればできると思うけど
効率的な管理方法は俺には分からないわ・・・
848デフォルトの名無しさん:2011/04/23(土) 15:28:57.62
ありがとうございます。
SQLiteでデータベース作って、サイズや速度に問題あったらまた聞きに来ます。
849デフォルトの名無しさん:2011/04/23(土) 17:01:16.15
mapの速度。Google遅いかメモリ食い過ぎ。
stlport_std::hash_map
Insert Time: 8.859 sec. Search Time: 2.875 sec.
ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB

stlport_std::tr1::unordered_map
Insert Time: 9 sec. Search Time: 2.765 sec.
ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB

stlport_std::map
Insert Time: 12.265 sec. Search Time: 14.953 sec.
ページフォールト数: 11422 最大ワーキングセットサイズ: 46846.0KB

google::sparse_hash_map ver.1.10
Insert Time: 65.171 sec. Search Time: 11.563 sec.
ページフォールト数: 12004 最大ワーキングセットサイズ: 48631.8KB

google::dense_hash_map ver.1.10
Insert Time: 11.89 sec. Search Time: 5.906 sec.
ページフォールト数: 29674 最大ワーキングセットサイズ: 82579.5KB

stdext::hash_map
Insert Time: 10.109 sec. Search Time: 7.5 sec.
ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB

tr1::unordered_map
Insert Time: 11.796 sec. Search Time: 8.641 sec.
ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB

std::map
Insert Time: 14.078 sec. Search Time: 13.953 sec.
ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB
850デフォルトの名無しさん:2011/04/23(土) 17:29:59.22
set速度
stlport_std::hash_set
Insert Time: 7.812 sec. Search Time: 2.844 sec.
ページフォールト数: 11008 最大ワーキングセットサイズ: 42033.2KB

stlport_std::tr1::unordered_set
Insert Time: 7.515 sec. Search Time: 2.922 sec.
ページフォールト数: 11008 最大ワーキングセットサイズ: 42033.2KB

stlport_std::set
Insert Time: 9.89 sec. Search Time: 13.75 sec.
ページフォールト数: 10446 最大ワーキングセットサイズ: 42844.2KB

google::sparse_hash_set
Insert Time: 54.656 sec. Search Time: 10.859 sec.
ページフォールト数: 11428 最大ワーキングセットサイズ: 46583.8KB

google::dense_hash_set
Insert Time: 10.953 sec. Search Time: 5.922 sec.
ページフォールト数: 27480 最大ワーキングセットサイズ: 76283.9KB

stdext::hash_set
Insert Time: 9.984 sec. Search Time: 6.297 sec.
ページフォールト数: 13923 最大ワーキングセットサイズ: 56840.2KB

tr1::unordered_set
Insert Time: 15.218 sec. Search Time: 8.578 sec.
ページフォールト数: 13923 最大ワーキングセットサイズ: 56840.2KB

std::set
Insert Time: 11.484 sec. Search Time: 12.172 sec.
ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB
851デフォルトの名無しさん:2011/04/23(土) 22:48:06.65
初心者なんだが
データ型 配列名[][横方向の要素数] = { { [0][0]の初期値, [0][1]の初期値, ・・・ },
{ [1][0]の初期値, [1][1]の初期値, ・・・ },
{ [2][0]の初期値, [2][1]の初期値, ・・・ },
:
};
こういう配列の代入って初期化の時しかできないの?
もしそうだったら、初期化じゃなくてもこう代入する方法はない?
852デフォルトの名無しさん:2011/04/23(土) 22:52:52.67
std::initializer_listを待つしかないな
853デフォルトの名無しさん:2011/04/23(土) 23:05:59.21
>>851
初期化は代入じゃないぞ
854デフォルトの名無しさん:2011/04/23(土) 23:28:16.85
>>853
よくわからんがそうなのか
とりあえず宣言した時じゃなくて、その後に上記の様に代入する方法を知りたい
855デフォルトの名無しさん:2011/04/23(土) 23:50:34.68
>>854
そのように初期化した配列を用意し、目的の配列にコピーする。
856デフォルトの名無しさん:2011/04/23(土) 23:52:18.27
>>854
C#にはそういう書式があるが、C/C++にはない
C++0xには付くかもね
857デフォルトの名無しさん:2011/04/24(日) 00:26:39.52
>>855-856
thx
関数作るわ
858デフォルトの名無しさん:2011/04/24(日) 01:22:49.93
>>857
↓みたいに書いてもいいと思うよ。別に読みずらくないし大してカッコ悪くもない
配列名[0][0]=初期値; 配列名[0][1]=初期値;
配列名[1][0]=初期値; 配列名[1][1]=初期値;
859デフォルトの名無しさん:2011/04/24(日) 10:13:32.76
initializer_list 早く使えるようになってほしいな…
static int a[] = { 1,2,3,4,5 };
std::vector<int> v( a, a+sizeof(a)/sizeof(int) ); とか書くの煩わしい
860デフォルトの名無しさん:2011/04/24(日) 11:34:12.42
template< typename C > class A
{
public:
typedef typename C::value_type value_type;
};

class B : public A< B >
{
public:
typedef unsigned int value_type;
};

これをVC++2010EEでコンパイルすると
error C2039: 'value_type' : 'B' のメンバーではありません。
とエラーになります。どうすればコンパイルが通るようになりますか?
861デフォルトの名無しさん:2011/04/24(日) 12:00:33.96
Bが確定しないのに、Bを含むAをBが継承するって、
どれだけ無限に再帰させれば気が済むんだよ?
862デフォルトの名無しさん:2011/04/24(日) 12:05:01.71
class A {
void func() { B* a = new B; }
};

class B {
//なんたらかんたら
};

とするとBが定義されていないってエラーが出ます。前方宣言もだめでした。
この場合BをAの前に持って行きたくない時はどうすればいいですか?
863デフォルトの名無しさん:2011/04/24(日) 12:25:19.45
無理だからあきらめろ
864デフォルトの名無しさん:2011/04/24(日) 12:32:20.56
先行宣言で使えるのはメンバ変数とか引数とか、具体的なクラス構造を
参照する必要がない場合だけで、インスタンス作っちゃうとアウト。
865デフォルトの名無しさん:2011/04/24(日) 12:54:23.87
>>862
class B の「宣言」をヘッダーでしてそれをインクルードしろ
これは定石
ついでにclass A もヘッダーで宣言しておけばよい

要するに宣言と定義を分ければOK
866デフォルトの名無しさん:2011/04/24(日) 13:16:50.60
int hoge[100];
// 略
std::sort(&hoge[0], &hoge[100]);

STLのsort等で、上のように普通の配列を使う事は可能ですか?
VC++で動作することは確認したのですが、保障されているんでしょうか。
867デフォルトの名無しさん:2011/04/24(日) 13:20:40.84
>>866
ポインタはランダムアクセスイテレータの要件を満たすので多分OKだと思う
868デフォルトの名無しさん:2011/04/24(日) 13:22:01.64
&hoge[100]っていいんだっけ?
869デフォルトの名無しさん:2011/04/24(日) 13:25:50.25
>>868
問題ない。

std::vector の &v[v.size()] はダメだけどね。
870デフォルトの名無しさん:2011/04/24(日) 13:44:23.74
int hoge[100];
std::sort(hoge,hoge+100);
個人的にのが好き
871デフォルトの名無しさん:2011/04/24(日) 17:47:19.89
普通は std::array でしょう
872860:2011/04/24(日) 17:49:01.38
>>861
別に再帰は起こらないと思いますが。
大体再帰がオーバーフローするなら、
そういうエラーになるでしょ?
873デフォルトの名無しさん:2011/04/24(日) 18:06:31.81
>>872
だから、そうなる前にはじくんじゃん
874デフォルトの名無しさん:2011/04/24(日) 18:36:20.27
A を具現する時点ではまだ B が不完全型なので C はメンバを持たず、よって検索に失敗する
つまり無理
875デフォルトの名無しさん:2011/04/24(日) 18:54:25.78
BCCのほうがわかりやすいメッセージ吐くな

依存関係にある型限定子 'B' に 'value_type' という名前のメンバー型がない
876デフォルトの名無しさん:2011/04/24(日) 19:04:56.10
>861
その構図だけなら CRTP として良く使われる技法だけどね。
877デフォルトの名無しさん:2011/04/24(日) 20:28:48.16
>>862です。皆様ありがとうございます。出掛けていて返事が遅れました。
宣言をヘッダーに置き、定義をソースファイルに置く事により無事解決しました。
ただ一つハテナ?と思う事がありました。
コンストラクタ内でnewしてしまうと、永久再帰に飛び込んでしまい、スタックオーバーフロー
で落ちます。それでinit()という別の初期化メンバ関数を作ったのですがどうにも不格好です。

#ifndef CLASS1_H
#define CLASS1_H

class B;

class A {
B* b;
public:
A();
void init();
void print() const;
void print2() const;
~A();
};

class B {
A* a;
public:
B();
void init();
void print() const;
void print2() const;
~B();
};

#endif
878デフォルトの名無しさん:2011/04/24(日) 20:29:31.03
#include <iostream>
#include "class1.h"
A::A() : b(0) {}
void A::init() { b = new B; }
void A::print() const {
std::cout << "This is class A." << std::endl;
}
void A::print2() const {
b->print();
}
A::~A() { delete b; }
B::B() : a(0) {}
void B::init() { a = new A; }
void B::print() const {
std::cout << "This is class B." << std::endl;
}
void B::print2() const {
a->print();
}
B::~B() { delete a; }
int main()
{
A a;
B b;
a.init(); // コンストラクタに入れると永久ループになりスタックオーバーフローする
b.init(); // 同上
a.print();
b.print();
a.print2();
b.print2();
}
879デフォルトの名無しさん:2011/04/24(日) 20:31:22.24
何とかnewをコンストラクタに入れてすっきりさせてしかも永久再帰にならないように
するスマートな方法はないでしょうか?
880デフォルトの名無しさん:2011/04/24(日) 20:49:52.62
クラスA,Bの結びつきがそこまで強いなら
元からAとBを合わせたほうがすっきりするような気がするけど…
881デフォルトの名無しさん:2011/04/24(日) 20:51:54.01
A,Bをメンバに持つクラスを作ってコンストラクタでそれぞれのアドレスを渡す
882デフォルトの名無しさん:2011/04/24(日) 21:15:39.45
>>880
やっぱりそうですね。
>>881
コンポジションですね。これでようやくコンポジションの使い方が分かりました。
うっかり継承を使って問題を複雑にする所でした。
883デフォルトの名無しさん:2011/04/24(日) 21:29:39.60
本当にコンポジションで済むなら
A、Bに引数付きのコンストラクタ作っって、
デフォルトコンストラクタからnewするときにthisを渡せばいいんじゃないの?

そもそも、再起がどうでコンパイルエラーをなくす事に気を取られて、
自分の動かそうとしているコードの意味を理解していないんじゃないか?

あと、相互参照してるときにデストラクタで相手を保持してるポインタを直接deleteすると、実行時に死ぬよ。
884デフォルトの名無しさん:2011/04/24(日) 21:32:35.60
>>883
今回はコンポジションが最適なようです。
プログラムを組み直します。

>そもそも、再起がどうでコンパイルエラーをなくす事に気を取られて、
>自分の動かそうとしているコードの意味を理解していないんじゃないか?

確かにご指摘の通りでした。

相互参照はしてないので、この場合は大丈夫なのかな?
885デフォルトの名無しさん:2011/04/24(日) 21:39:43.54
boost::weak_ptrがわざわざ用意されているのも、boost::shared_ptrで
循環参照の環が切れなくなってリソースが解放出来なくなるトラブルを
防ぐためでしたね。

頭で理解しているのと、実際にプログラムを組んでみるのとではかなり
差があります。こういう差を持っているとデバッグの時に苦しみそうです。
886デフォルトの名無しさん:2011/04/29(金) 17:51:43.32
2つのbool型変数a,bがあるとき、
if(a==b)
funcA();
else
funcB();
これを少しでも高速にする方法ってありますかね
xorのほうが速かったりしますかね?
887デフォルトの名無しさん:2011/04/29(金) 18:06:48.35
>>886
本当にそんな箇所がボトルネックなのか?
もっと他に高速化すべき箇所があるんじゃないか?
888デフォルトの名無しさん:2011/04/29(金) 18:11:25.64
別にネックじゃないけど高速化したいんじゃないの?
889デフォルトの名無しさん:2011/04/29(金) 18:32:04.46
必要性なんぞこの質問に関係ないだろ
890886:2011/04/29(金) 18:38:14.98
>>887
一回一回はそれなりに軽快なんだけども、この分岐を相当数経由するので・・・
今後のためにも、boolの高速な比較方法を教えていただきたい
891デフォルトの名無しさん:2011/04/29(金) 18:50:42.80
引数と返り値をあわせられるなら関数ポインタ使うとか
void (*func)() = funcB;
if(a==b) func = funcA;
func();

または
func = a==b ? funcA : funcB;
func();

elseない分ちょっと速いかも。

あとは邪道かもしれんが配列にして
void (*func[])() = {funcB, funcA};
func[a==b]();

くらいかな
892デフォルトの名無しさん:2011/04/29(金) 19:04:23.24
>>891
関数ポインタか、なるほど。試してみます。

全部のヤツで「a==b」を使って比較しているようですが、
==が一番高速ってことなのでしょうか。
個人的にはa^b(exor,ビット演算)のほうが速いと思っていたのですが。
893デフォルトの名無しさん:2011/04/29(金) 19:09:32.08
速いかどうかは測ってみるのが一番
894デフォルトの名無しさん:2011/04/29(金) 19:16:26.95
ビット演算子の方が速いよ
心配ならいろんなところググって調べろ
895デフォルトの名無しさん:2011/04/29(金) 19:20:39.43
分岐ってそんなに差が出るものなの?
896デフォルトの名無しさん:2011/04/29(金) 19:50:19.35
たとえ0.1秒の差でも1万回通れば1000秒だ
897デフォルトの名無しさん:2011/04/29(金) 19:55:09.71
0.1秒も差がつくわけねーだろ
898デフォルトの名無しさん:2011/04/29(金) 20:18:58.26
>>892
if(a == b)の場合
> movzbl -1(%ebp), %edx
> movzbl -2(%ebp), %eax
> cmpl %eax, %edx
> jne L11

if(a ^ b)の場合
> movzbl -1(%ebp), %edx
> movzbl -2(%ebp), %eax
> cmpl %eax, %edx
> je L11

g++で比較してみたけど、マシン語レベルではどっちもほぼ同じだよ。
899デフォルトの名無しさん:2011/04/29(金) 20:27:06.39
そもそも==で分岐などしない
比較結果のフラグレジスタの値を返すだけ
分かっていない奴は最低限アセンブラぐらいやってから語れよ
900デフォルトの名無しさん:2011/04/29(金) 20:41:12.49
>>899
フラグレジスタを使って「ジャンプ(≒分岐)」する、と俺は習ったが。
そもそも==が分岐とは誰も言ってないぞ・・・
書き込み読んでから、な。
901 忍法帖【Lv=22,xxxPT】 :2011/04/29(金) 20:46:14.99
何故かx86限定っぼいけど、ビットxorしたからって分岐を無くせる訳じゃないから大差ないよ。
要は、殆ど無駄な努力。
902デフォルトの名無しさん:2011/04/29(金) 20:46:46.61
==はただの演算子でしかない。
結果が返されるだけでジャンプや分岐とは無関係。
903デフォルトの名無しさん:2011/04/29(金) 20:50:04.77
寧ろfuncA()やfuncB()をインライン展開できるように調整するとか分岐そのものをループ外に追い出すとか。
904892:2011/04/29(金) 20:54:19.26
>>898
わざわざありがとうございます。
これで安心して先に進めます。

関数ポインタ使ったら処理時間が短くなりました。
皆さんありがとうございました。
905デフォルトの名無しさん:2011/04/29(金) 21:31:10.28
>>904
最後になんのプログラムなのか教えて
気になるよ・・・
906デフォルトの名無しさん:2011/04/29(金) 21:37:20.07
関数ポインタって分岐予測もプリフェッチも全部フラッシュしちゃうんでしょ?
C++の仮想関数のコストが騒がれたのも同様の理由による
パイプラインが深い今のCPUにとってはかなりの重荷
907デフォルトの名無しさん:2011/04/29(金) 21:39:45.62
みひく
908デフォルトの名無しさん:2011/04/29(金) 21:41:49.09
関数ポインタは確実に遅くなる。
分岐予測など効かず、速度を出す場面で使うべきで無い。
コンパイラ、CPUにもよるが、単なる関数呼び出しやGOTOよりも遅い。
909デフォルトの名無しさん:2011/04/29(金) 21:47:09.03
>>904 はベンチとって速くなったっていってるんじゃないの?
910デフォルトの名無しさん:2011/04/29(金) 21:51:57.40
>>905
画像処理系のプログラムです。
お世話になりました。

>>909
はい、関数ポインタも含めていろいろといじくったら、ベンチの結果が改善しました。
逆に悪化したところもあると思うので、そこらへんは明日やろうと思います。

皆さん本当にありがとうございました。
911デフォルトの名無しさん:2011/04/29(金) 22:02:53.21
へえ、やっぱ速くなったんだ
分岐が大量にあったり多岐にわたるコードなら、関数ポインタもいまだ有効とは聞くが。
分岐予測だのあまり過信せず、パフォーマンスを一々計ったほうがよさそうかな?
912デフォルトの名無しさん:2011/04/29(金) 22:03:52.55
関数ポインタを使った積もりでも、巧いこと閉じてさえいればコンパイラによってはインライン展開できるだろ。
913デフォルトの名無しさん:2011/04/29(金) 22:03:54.73
速くなったのは他の所をいじくったせいじゃないの?
914デフォルトの名無しさん:2011/04/29(金) 22:04:03.66
>>906
たしか飛び先が前回と同じなら大丈夫だったと思うよ
まぁ何のために関数ポインタって飛び先が変わるためだろうからあんまり意味ないんだろうけど
915デフォルトの名無しさん:2011/04/29(金) 22:04:23.26
関数ポインタを使って関数呼び出すと、インライン展開は確実に出来ないのはわかるだろ。
if文で関数呼び出したときは、インライン展開される可能性はある。
スイッチ文もあまりはやくならない。
if文で確定しやすい順に判定するのが一番。
916デフォルトの名無しさん:2011/04/29(金) 22:05:51.53
どうコンパイルされてるか分からんのであれだが、

> func = a==b ? funcA : funcB;
> func();
>
> elseない分ちょっと速いかも。

これはelse無いと判断していいんだろうか。
917デフォルトの名無しさん:2011/04/29(金) 22:06:56.37
60%、10%、1%、1%、1%、1%、・・・などと分岐に偏りがあればこの順に判定。
1%、1%、1%、1%、・・・、10%、60%とすると無駄な判定が増える。
918デフォルトの名無しさん:2011/04/29(金) 22:10:04.95
>>915
でもインラインが必ずしも速くなるわけじゃないからな
キャッシュミス起こしたり変数大量にあるとレジスタ足りなくなったり
ってWikiにあったぞ
919デフォルトの名無しさん:2011/04/29(金) 22:14:12.26
プロファイラがあれば取って見ればどの関数がスピードアップしたのか一目瞭然
920デフォルトの名無しさん:2011/04/29(金) 22:15:09.05
>>911
実測に重きを置くのは賛同だけど基本的に>>887でFA
組み込み向けで特定の(たった一つの)機種のために最適化するなら何でもありだけど、
ある程度動作対象マシンに幅のある汎用プログラム書いてるならバイナリレベルの最適化は時間の無駄だと思う。
921デフォルトの名無しさん:2011/04/29(金) 22:16:41.61
だから必要性なんぞ問題にしてない
922デフォルトの名無しさん:2011/04/29(金) 22:22:56.25
問題は何だ
923デフォルトの名無しさん:2011/04/29(金) 22:38:55.78
自己満足。つまり、自慰。
相手が満足するかは二の次と言う意味では、素人童貞は童貞と一緒と言うことだ。
924デフォルトの名無しさん:2011/04/30(土) 01:05:30.25
画像処理なら大量の分岐を無くす事は意味あるかもなぁ
925デフォルトの名無しさん:2011/04/30(土) 23:46:46.75
前にほんのちょいとだけC言語をかじったものですが
またプログラミングっぽいことがしたいなと思い始めてきました
C++はプログラム言語の中でも取得が難しいとか聞きますが、
ほぼ未経験の状態で勉強を始めるのは無謀でしょうか
926デフォルトの名無しさん:2011/04/30(土) 23:50:18.59
Cの基本ができてれば、できなくは無いな。
クラスは必要なら使えばいい。でもテンプレート関係は使うとかなり楽しいよ。
927デフォルトの名無しさん:2011/04/30(土) 23:50:20.42
べつにそんなことはない
928デフォルトの名無しさん:2011/05/01(日) 00:00:46.43
誰でも最初は未経験だよ
929デフォルトの名無しさん:2011/05/01(日) 00:03:08.81
C++は入門書に加えて最低でもEC++とMEC++ぐらいは理解してくれてないとバグ混入やパフォーマンス低下が怖くて現場では使えない
930デフォルトの名無しさん:2011/05/01(日) 00:12:18.74
いらない解説どうも
931デフォルトの名無しさん:2011/05/01(日) 00:20:24.08
>>925
いきなりCプラプラはまず無理だからPerlとか人気で楽で使える言語先にやって慣れてからにしたほうがいいよ
932デフォルトの名無しさん:2011/05/01(日) 00:22:31.87
>>929
自分に関連するコードの差分チェックすらしない人なの?
933デフォルトの名無しさん:2011/05/01(日) 00:59:23.28
>>925
最終的に何を作りたいかで、言語は選ぶのがいいと思うよ
特にやりたい事が楽にできるライブラリがあるかは、結構ポイントだと思う
C++は気に食わない所があったら、直せなければ気が済まないような人に向いてるかなw

今ならC#とか結構いいんじゃないか
.net入ってるなら、コンパイラも入っている筈だし
934デフォルトの名無しさん:2011/05/01(日) 01:05:44.74
C#のことは聞いてないだろ
935デフォルトの名無しさん:2011/05/01(日) 16:43:27.43
底辺ドカタは人とのコミュニケーション能力ないからドカタになるんだろ
ITドカタの場合はコンペータとしかコミュできないからしょうがないよな
ドカタは人とのコミュであさっての方向レスをシャキーーンとするからな
936デフォルトの名無しさん:2011/05/01(日) 16:45:02.53
それはC++に関する質問ですか?
937デフォルトの名無しさん:2011/05/01(日) 16:57:51.53
自己紹介だろ
938デフォルトの名無しさん:2011/05/01(日) 17:36:05.88
あなたはC++とだけしかやり取りできないですか?
939デフォルトの名無しさん:2011/05/01(日) 17:58:27.03
何を言っているのですか。Cとも出来ます。
940デフォルトの名無しさん:2011/05/01(日) 18:46:22.57
C++で、幾つかのデザインパターンを使って、クラスを継承させながら
モジュールを作れるようになったら、もう中級レベルを名乗ってOkですか?

C++初めて3ヶ月位ですが、何か目標みたいなのを探しています。
941デフォルトの名無しさん:2011/05/01(日) 18:53:45.73
中級レベルを名乗るならEffective C++とExceptional C++の内容が最低限分かってないと駄目じゃね
デザインパターンとか初級者レベルだべ
942デフォルトの名無しさん:2011/05/01(日) 18:56:47.05
あとEffectiveSTLあたりのSTL関連が理解出来て初心者卒業じゃね?
943デフォルトの名無しさん:2011/05/01(日) 19:04:14.84
>>940
boostのラムダあたりが実装できるレベルが中級
944デフォルトの名無しさん:2011/05/01(日) 19:08:21.94
なんか似たようなのTwitterで見たなw

これをパッと的確に答えられると中級者らしい
>「boost::shared_ptr の実装は非常に非効率で,私はあれはポリシー化すべきだと思うのですが,これについてあなたはどう思いますか?」
>「boost::shared_ptr か boost::intrusive_ptr かのどちらかを人に勧める場合,デフォルトではどちらが良いと思いますか? 理由を添えてお答えください.」
>「boost::weak_ptr の有効な使い方を1つ挙げてみてください.」
945デフォルトの名無しさん:2011/05/01(日) 19:26:03.93
STLはそこそこ使えるけど、まともに何かを作ってないのでデザインパターンとかさっぱり
946デフォルトの名無しさん:2011/05/01(日) 19:31:19.20
boost使わないと中級者になれないのか
947デフォルトの名無しさん:2011/05/01(日) 19:36:27.63
今って勉強するのに時期が悪いんだよなぁ。
本買ってもC++0xに準拠してない。STLとかがらっと変わるだろうし
早いとこ仕様固まって欲しい。
948デフォルトの名無しさん:2011/05/01(日) 19:37:06.26
boost で使われている C++ の技術を理解できればよい
boost そのものは使わない・使えなくても
949デフォルトの名無しさん:2011/05/01(日) 19:44:24.33
レスどうもです!中級になるのも一苦労みたいっすね
とりあえず上の三冊を揃えて、勉強します
どうせGW何もすることないし
950デフォルトの名無しさん:2011/05/01(日) 19:46:45.91
桃栗3年柿8年
951デフォルトの名無しさん:2011/05/01(日) 20:35:08.16
ttp://codepad.org/vz92VhdM
なんでやねん
952デフォルトの名無しさん:2011/05/01(日) 20:42:53.64
953デフォルトの名無しさん:2011/05/01(日) 20:52:01.74
>>951-952
コピーコンストラクタと代入演算子はちげーし。
954デフォルトの名無しさん:2011/05/01(日) 21:12:50.73
中級者になれなくてもライブラリ使って何か組めるようになったんならいいじゃん!
955デフォルトの名無しさん:2011/05/01(日) 21:20:20.60
BoostかC++0x使わないC++なんて使いもんにならねーだろjk
956デフォルトの名無しさん:2011/05/01(日) 21:25:08.85
>>953
コピーコンストラクタですらない件について
http://codepad.org/HeOxk10g
957デフォルトの名無しさん:2011/05/01(日) 21:42:38.93
中級者を名乗っても別にいいと思う。
いつまでたっても上級者と名乗る自信をもつことはないのだから。
958デフォルトの名無しさん:2011/05/01(日) 22:31:34.96
>926-933
多くのレスをどうも有難うございます
一応アクションゲームっぽいのが作ってみたいかな…と思って調べると
やっぱりCとかC++が有用そうで、こちらで質問させて頂いた次第です
なんとかなるというお話と無理というお話で解れているみたいなのでちょっと迷いますが、
とりあえず少し弄ってみて、無理そうだったらC#でも改めて調べてみる事にします
959デフォルトの名無しさん:2011/05/01(日) 22:45:02.04
GUIのプロトタイピングするんであればC#お勧めだな。C#標準でGUI関係を内包してるからね。
速度とか複雑な描画とかが必要になったらそのときにはDirectX関連かOpenGL関連にすすむといい。
960デフォルトの名無しさん:2011/05/01(日) 22:45:21.57
>>956
じゃあ何だというのです
エラーになる理由が見当たらない
961デフォルトの名無しさん:2011/05/01(日) 22:45:41.84
どうやったら上級者?
962デフォルトの名無しさん:2011/05/01(日) 22:46:49.26
C++でC++のコンパイラ実装したらかねぇ??
963デフォルトの名無しさん:2011/05/01(日) 22:47:09.67
標準化委員会ですらよくわかっていないんだから名乗れば上級者
964デフォルトの名無しさん:2011/05/01(日) 22:49:45.98
>>951-952,956,960
プログラムの意味的にはそこでコピーコンストラクタを要求するが、
コンパイル結果としてコピーコンストラクタを呼び出す必要は無い、
という少し特殊な状況です。
965デフォルトの名無しさん:2011/05/01(日) 22:58:20.54
>>964
テンポラリのconst参照による束縛は仕様的にはコピーだったということですか?
だから普段は最適化でコピーは呼ばれないように錯覚してたけど
今回はシグネチャレベルで弾かれて驚いたと
966デフォルトの名無しさん:2011/05/01(日) 23:06:34.51
>>965
const参照による束縛は関係ありません。
初期化の構文と、その解釈と、その後の最適化の話です。
967デフォルトの名無しさん:2011/05/02(月) 07:44:25.40
>>966
これのことかな?
「コンストラクタに無名のインスタンスが渡されたらコピーコンストラクタは呼ばれない」
968デフォルトの名無しさん:2011/05/02(月) 09:04:22.61
規格書 8.5.3
If the initializer expression is an rvalue, with T2 a class type, and “cv1 T1” is
reference-compatible with “cv2 T2,” the reference is bound in one of the
following ways (the choice is implementation-defined): <--- コピーされるかどうかは実装依存

- The reference is bound to the object represented by the rvalue (see 3.10) or
to a sub-object within that object.

- A temporary of type “cv1 T2” is created, and a constructor is called to
copy the entire rvalue object into the temporary. The reference is bound to
the temporary or to a sub-object within the temporary.

The constructor that would be used to make the copy shall be callable whether
or not the copy is actually done. <--- コピーされようがされまいが、コピー可能でなければならない
エラーになるのはこのためとおもわれ
969デフォルトの名無しさん:2011/05/02(月) 09:05:57.65
省略してもよいと決められていても省略しない場合に禁止されていることは出来ない
970デフォルトの名無しさん:2011/05/02(月) 12:03:51.48
>>968
カコイイ。
971デフォルトの名無しさん:2011/05/02(月) 13:56:34.46
externって普段使ってますか?
どういうときに使いますか
972デフォルトの名無しさん:2011/05/02(月) 14:08:17.17
>>968
8.5.3 は参照の初期化だからこの流れとは違うね。
8.5 p14 にある "If the destination type is a (possibly cv-qualified) class type:" の
↓ここが該当する。
> If the initialization is direct-initialization, or if it is copy-initialization where the
> cv-unqualified version of the source type is the same class as, or a derived class of,
> the class of the destination, constructors are considered. ...

この場合のコピーコンストラクタの省略については 12.8 p14,15 にある。
973デフォルトの名無しさん:2011/05/02(月) 14:29:12.57
ん?8.5 p14には
- If the destination type is a reference type, see 8.5.3. とあるけど
参照の話ではないの?
974972:2011/05/02(月) 14:30:38.71
>>973
あ、 >>951-952 は参照の話だね。ごめん見間違えた。
975デフォルトの名無しさん:2011/05/02(月) 22:07:52.23
>>971
ほかで宣言されたグローバル変数を使いたいとき
色んなライブラリで結構使われてませんか?
976デフォルトの名無しさん:2011/05/02(月) 22:13:39.34
>>975
よく使いますか?
977デフォルトの名無しさん:2011/05/02(月) 22:51:28.43
>>971
C++では使う必要性が殆どないな
978デフォルトの名無しさん:2011/05/02(月) 23:00:21.25
externの意義がよくわからん
includeすれば使えるんじゃないの?
C++から始めたからか、よく分からん
979デフォルトの名無しさん:2011/05/02(月) 23:01:04.58
グローバル変数を複数のソースファイルに渡すのに使えるぞ
980デフォルトの名無しさん:2011/05/02(月) 23:04:50.67
static int manko;
extern int manko;
こうやって他人に嫌がらせするのに使う。
981デフォルトの名無しさん:2011/05/02(月) 23:07:47.51
名前空間ですよね
982デフォルトの名無しさん:2011/05/02(月) 23:11:05.09
char A,B,C,D,Eを99個持つとしたときにどっちの方が効率がいいのかな

1:構造体を99個作ってcharメンバを5つ持つ
2:コンテナ<コンテナ<char>>にして持つ
983デフォルトの名無しさん:2011/05/02(月) 23:24:50.63
3:
だね
984デフォルトの名無しさん:2011/05/02(月) 23:32:28.12
効率的にも意味的にも1に決まってる。
効率なんてどうでもいいと思うが
985デフォルトの名無しさん:2011/05/02(月) 23:33:48.48
>>984
ですよねー

なぜあの時構造体が思いつかなかったのか・・・
何故コンテナで持つことを考え付いてしまったのか
986デフォルトの名無しさん:2011/05/02(月) 23:34:37.33
まぁどうせC++なんだからさ。ケチケチしないでコンテナ使っていくのはある種正解。
987デフォルトの名無しさん:2011/05/03(火) 00:05:48.83
char a[99], b[99], c[99], d[99], e[99];
988デフォルトの名無しさん:2011/05/03(火) 03:41:56.80
std::array<std::tuple<char, char, char, char, char>, 99>
989デフォルトの名無しさん:2011/05/03(火) 05:22:58.51
typedef std::pair<std::string, char> StringCharPair;
std::map<std::string, char> hoge[99];
hoge[0].insert(StringCharPair("A", '0'));
hoge[0].insert(StringCharPair("B", '1'));
hoge[0].insert(StringCharPair("C", '2'));
hoge[0].insert(StringCharPair("D", '3'));
hoge[0].insert(StringCharPair("E", '4'));
990デフォルトの名無しさん:2011/05/03(火) 05:46:36.42
派生クラスで外部の基本クラスのprotectedメンバにアクセスしたいばあいってどうするのよ

class Base
{
protected:
 int hoge;
};

class Derived
{
public:
 void f(Base * pBase) {
  ... pBase->hoge ... // エラー
 }

 void f(Derived * pDerived) {
  ... pDerived->hoge ... // 問題ない
 }
};
991デフォルトの名無しさん:2011/05/03(火) 05:48:27.32
friendでおk
992デフォルトの名無しさん:2011/05/03(火) 05:50:52.46
>>987は thread_info inf[MAX]; を int tid[MAX]; HANDLE ht[MAX]; int stat[MAX];と書くバカ。
>>988は int cur_count, count_limit, thread_id; をint num[3]; とか書くバカ。
>>989は int cur_count, count_limit, thread_id; をpair<string, int> num; とか書くバカ。
>>990は #define private publicとか書くバカ。

こういう奴らが他人が読めない糞コードを量産する。
993デフォルトの名無しさん:2011/05/03(火) 05:56:45.87
>>991
それじゃprivateも見えちゃうじゃん!!

>>992
ネタにマ(ry
994デフォルトの名無しさん:2011/05/03(火) 06:12:14.23
protectedなんだからしょうがないだろ。実体がDerivedじゃないかも
知れないのにDerivedに見せるのはおかしい。

実体がDerivedとわかってるなら、
derived *pd = dynamic_cast<derived *>(pb);

実体がDerivedじゃなくても公開したいなら、Baseに
static int &get_hoge(base *pb) { return pb->hoge; }
でも作るのかなあ。
995デフォルトの名無しさん:2011/05/03(火) 06:24:54.54
>>994
だけど必要になってしまったんだ

> 実体がDerivedじゃなくても公開したいなら、Baseに
> static int &get_hoge(base *pb) { return pb->hoge; }
> でも作るのかなあ。
なるほど、これで回避できるのか・・・
996デフォルトの名無しさん:2011/05/03(火) 07:49:24.68
>>995
なんで Derived って名前で Base を継承してないの?
997デフォルトの名無しさん:2011/05/03(火) 08:05:08.81
>>992はSoA vs AoSと言う議論も知らない馬鹿w
998デフォルトの名無しさん:2011/05/03(火) 08:21:56.71
>>996
書き忘れてただけ

誤: class Derived
正: class Derived : public Base
999デフォルトの名無しさん:2011/05/03(火) 11:14:14.46
>>992
キャッシュ効率を考えてあえてバラして配列にすることはあるでしょ
1000デフォルトの名無しさん:2011/05/03(火) 12:48:54.26
随分と頭がカッチカチだなぁ・・・
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。